Перейти к содержанию

Dialplan — CDR логика

Файл: /etc/asterisk/extensions_cdr.conf

[cdr-init]
exten => s,1,NoOp(=== CDR Init: queue=${ARG1}, tenant=${ARG2}, called=${ARG3} ===)
 same => n,Set(CDR_QUEUE=${ARG1})
 same => n,Set(CDR_TENANT_ID=${ARG2})
 same => n,Set(CDR_CALLED=${ARG3})
 same => n,Set(CDR_ENTERED_EPOCH=${EPOCH})
 same => n,Set(CDR_ENTERED_TIME=${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)})
 same => n,Set(CDR_CALL_DATE=${STRFTIME(${EPOCH},,%Y-%m-%d)})
 same => n,Set(CDR_CALL_TIME=${STRFTIME(${EPOCH},,%H:%M:%S)})
 same => n,Set(CDR_CALLER=${CALLERID(num)})
 same => n,Set(CDR_LOGGED=0)
 same => n,Set(__CDR_CALL_ID=${UNIQUEID})
 same => n,Set(__CDR_LINKED_ID=${LINKEDID})
 same => n,Set(DB(cdr/${UNIQUEID}/answer_epoch)=0)
 same => n,Set(RECORDING_FILE_BASE=${STRFTIME(${EPOCH},,%Y%m%d)}-${STRFTIME(${EPOCH},,%H%M%S)}-${UNIQUEID})
 same => n,Set(RECORDING_FILE=${RECORDING_FILE_BASE}.wav)
 same => n,Set(RECORDING_FILE_CALLER=${RECORDING_FILE_BASE}_caller.wav)
 same => n,Set(RECORDING_FILE_OPERATOR=${RECORDING_FILE_BASE}_operator.wav)
 same => n,Set(__CDR_RECORDING_FILE=${RECORDING_FILE})
 same => n,Set(__CDR_RECORDING_FILE_CALLER=${RECORDING_FILE_CALLER})
 same => n,Set(__CDR_RECORDING_FILE_OPERATOR=${RECORDING_FILE_OPERATOR})
 same => n,MixMonitor(/var/spool/asterisk/monitor/${RECORDING_FILE},br(/var/spool/asterisk/monitor/${RECORDING_FILE_CALLER})t(/var/spool/asterisk/monitor/${RECORDING_FILE_OPERATOR}))
 same => n,NoOp(Recording started: ${RECORDING_FILE})
 same => n,Return()
[cdr-log-abandoned]
exten => s,1,NoOp(=== CDR Log Abandoned: reason=${ARG1} ===)
 same => n,Set(ABANDON_REASON=${ARG1})
 same => n,Set(CDR_END_TIME=${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)})
 same => n,Set(WAIT_TIME=$[${EPOCH} - ${CDR_ENTERED_EPOCH}])
 same => n,StopMixMonitor()
 same => n,System(rm -f /var/spool/asterisk/monitor/${RECORDING_FILE} /var/spool/asterisk/monitor/${RECORDING_FILE_CALLER} /var/spool/asterisk/monitor/${RECORDING_FILE_OPERATOR})
 same => n,Set(ODBC_RESULT=${ODBC_LOG_QUEUE_CALL_ABANDONED(${UNIQUEID},${CDR_LINKED_ID},${CDR_ENTERED_TIME},${CDR_CALL_DATE},${CDR_CALL_TIME},${CDR_CALLER},${CDR_CALLED},${CDR_QUEUE},${ABANDON_REASON},${WAIT_TIME},0,${CDR_TENANT_ID})})
 same => n,NoOp(CDR logged: abandoned/${ABANDON_REASON} tenant=${CDR_TENANT_ID})
 same => n,Set(CDR_LOGGED=1)
 same => n,NoOp(Cleaning up AstDB)
 same => n,Set(dummy=${DB_DELETE(cdr/${UNIQUEID}/answer_epoch)})
 same => n,Return()
[cdr-log-answered]
exten => s,1,NoOp(=== CDR Log from h extension ===)
 same => n,GotoIf($[${CDR_LOGGED} = 1]?skip)
 same => n,GotoIf($["${CDR_QUEUE}" = ""]?skip)
 same => n,StopMixMonitor()
 same => n,GotoIf($["${CDR_QUEUE_START_EPOCH}" = ""]?abandoned_greeting)
 same => n,Set(ANSWER_EPOCH=${DB(cdr/${UNIQUEID}/answer_epoch)})
 same => n,NoOp(Answer epoch from AstDB: ${ANSWER_EPOCH} for ${UNIQUEID})
 same => n,GotoIf($[${ABANDONED} = TRUE]?abandoned_queue)
 same => n,GotoIf($[${QUEUESTATUS} = TIMEOUT]?abandoned_queue)
 same => n,GotoIf($[${ANSWER_EPOCH} = 0]?abandoned_queue)
 same => n,GotoIf($["${ANSWER_EPOCH}" = ""]?abandoned_queue)
 same => n,Set(TALK_TIME=$[${EPOCH} - ${ANSWER_EPOCH}])
 same => n,Set(WAIT_TIME=$[${ANSWER_EPOCH} - ${CDR_ENTERED_EPOCH}])
 same => n,NoOp(Talk: ${TALK_TIME}s, Wait: ${WAIT_TIME}s)
 same => n,Set(AGENT_ENDPOINT=${DB(cdr/${UNIQUEID}/agent_endpoint)})
 same => n,NoOp(Agent endpoint from AstDB: ${AGENT_ENDPOINT})
 same => n,Set(CDR_INTERFACE=PJSIP/${AGENT_ENDPOINT})
 same => n,Set(CDR_OPERATOR=${ODBC_GET_OPERATOR_BY_ENDPOINT(${AGENT_ENDPOINT},${CDR_TENANT_ID})})
 same => n,NoOp(Resolved operator: ${CDR_OPERATOR} interface: ${CDR_INTERFACE})
 same => n,Set(ODBC_RESULT=${ODBC_LOG_QUEUE_CALL_ANSWERED(${UNIQUEID},${CDR_LINKED_ID},${CDR_ENTERED_TIME},${CDR_CALL_DATE},${CDR_CALL_TIME},${CDR_CALLER},${CDR_CALLED},${CDR_QUEUE},${CDR_OPERATOR},${CDR_INTERFACE},${WAIT_TIME},${TALK_TIME},0,${CDR_TENANT_ID},${CDR_RECORDING_FILE},${CDR_RECORDING_FILE_CALLER},${CDR_RECORDING_FILE_OPERATOR})})
 same => n,NoOp(CDR logged: answered, operator=${CDR_OPERATOR}, talk=${TALK_TIME}s, recording=${CDR_RECORDING_FILE})
 same => n,Set(CDR_LOGGED=1)
 same => n,Goto(cleanup)
 same => n(abandoned_greeting),NoOp(Call abandoned on greeting)
 same => n,System(rm -f /var/spool/asterisk/monitor/${RECORDING_FILE} /var/spool/asterisk/monitor/${RECORDING_FILE_CALLER} /var/spool/asterisk/monitor/${RECORDING_FILE_OPERATOR})
 same => n,Set(WAIT_TIME=$[${EPOCH} - ${CDR_ENTERED_EPOCH}])
 same => n,Set(ODBC_RESULT=${ODBC_LOG_QUEUE_CALL_ABANDONED(${UNIQUEID},${CDR_LINKED_ID},${CDR_ENTERED_TIME},${CDR_CALL_DATE},${CDR_CALL_TIME},${CDR_CALLER},${CDR_CALLED},${CDR_QUEUE},greeting,${WAIT_TIME},0,${CDR_TENANT_ID})})
 same => n,NoOp(CDR logged: abandoned on greeting)
 same => n,Set(CDR_LOGGED=1)
 same => n,Goto(cleanup)
 same => n(abandoned_queue),NoOp(Call abandoned in queue)
 same => n,System(rm -f /var/spool/asterisk/monitor/${RECORDING_FILE} /var/spool/asterisk/monitor/${RECORDING_FILE_CALLER} /var/spool/asterisk/monitor/${RECORDING_FILE_OPERATOR})
 same => n,Set(WAIT_TIME=$[${EPOCH} - ${CDR_ENTERED_EPOCH}])
 same => n,Set(ODBC_RESULT=${ODBC_LOG_QUEUE_CALL_ABANDONED(${UNIQUEID},${CDR_LINKED_ID},${CDR_ENTERED_TIME},${CDR_CALL_DATE},${CDR_CALL_TIME},${CDR_CALLER},${CDR_CALLED},${CDR_QUEUE},queue_timeout,${WAIT_TIME},0,${CDR_TENANT_ID})})
 same => n,NoOp(CDR logged: abandoned in queue)
 same => n,Set(CDR_LOGGED=1)
 same => n(cleanup),NoOp(Cleaning up AstDB)
 same => n,Set(dummy=${DB_DELETE(cdr/${UNIQUEID}/answer_epoch)})
 same => n,Set(dummy=${DB_DELETE(cdr/${UNIQUEID}/agent_endpoint)})
 same => n(skip),Return()
[cdr-agent-answer]
exten => s,1,NoOp(=== Agent answered, caller UNIQUEID=${CDR_CALL_ID} ===)
 same => n,Set(DB(cdr/${CDR_CALL_ID}/answer_epoch)=${EPOCH})
 same => n,Set(DB(cdr/${CDR_CALL_ID}/agent_endpoint)=${CHANNEL(endpoint)})
 same => n,NoOp(Saved answer epoch ${EPOCH} agent endpoint ${CHANNEL(endpoint)} for call ${CDR_CALL_ID})
 same => n,Return()
[cdr-init-direct]
exten => s,1,NoOp(=== CDR Init Direct: extension=${ARG1}, tenant=${ARG2}, called=${ARG3} ===)
 same => n,Set(CDR_EXTENSION=${ARG1})
 same => n,Set(CDR_TENANT_ID=${ARG2})
 same => n,Set(CDR_CALLED=${ARG3})
 same => n,Set(CDR_ENTERED_EPOCH=${EPOCH})
 same => n,Set(CDR_ENTERED_TIME=${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)})
 same => n,Set(CDR_CALL_DATE=${STRFTIME(${EPOCH},,%Y-%m-%d)})
 same => n,Set(CDR_CALL_TIME=${STRFTIME(${EPOCH},,%H:%M:%S)})
 same => n,Set(CDR_CALLER=${CALLERID(num)})
 same => n,Set(CDR_LOGGED=0)
 same => n,Set(CDR_CALL_TYPE=direct)
 same => n,Set(__CDR_LINKED_ID=${LINKEDID})
 same => n,Set(RECORDING_FILE_BASE=${STRFTIME(${EPOCH},,%Y%m%d)}-${STRFTIME(${EPOCH},,%H%M%S)}-${UNIQUEID})
 same => n,Set(__CDR_RECORDING_FILE=${RECORDING_FILE_BASE}.wav)
 same => n,Set(__CDR_RECORDING_FILE_CALLER=${RECORDING_FILE_BASE}_caller.wav)
 same => n,Set(__CDR_RECORDING_FILE_OPERATOR=${RECORDING_FILE_BASE}_operator.wav)
 same => n,MixMonitor(/var/spool/asterisk/monitor/${CDR_RECORDING_FILE},br(/var/spool/asterisk/monitor/${CDR_RECORDING_FILE_CALLER})t(/var/spool/asterisk/monitor/${CDR_RECORDING_FILE_OPERATOR}))
 same => n,NoOp(Recording started: ${CDR_RECORDING_FILE})
 same => n,Return()
[cdr-log-direct]
exten => s,1,NoOp(=== CDR Log Direct Call ===)
 same => n,GotoIf($[${CDR_LOGGED} = 1]?skip)
 same => n,GotoIf($[${CDR_CALL_TYPE} != direct]?skip)
 same => n,StopMixMonitor()
 same => n,Set(TOTAL_TIME=$[${EPOCH} - ${CDR_ENTERED_EPOCH}])
 same => n,Set(TALK_TIME=${CDR(billsec)})
 same => n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?answered:not_answered)
 same => n(answered),Set(WAIT_TIME=$[${TOTAL_TIME} - ${TALK_TIME}])
 same => n,Set(CALL_STATUS=answered)
 same => n,Goto(log_it)
 same => n(not_answered),Set(WAIT_TIME=${TOTAL_TIME})
 same => n,Set(TALK_TIME=0)
 same => n,Set(CALL_STATUS=missed)
 same => n,System(rm -f /var/spool/asterisk/monitor/${CDR_RECORDING_FILE} /var/spool/asterisk/monitor/${CDR_RECORDING_FILE_CALLER} /var/spool/asterisk/monitor/${CDR_RECORDING_FILE_OPERATOR})
 same => n,Set(CDR_RECORDING_FILE=)
 same => n,Set(CDR_RECORDING_FILE_CALLER=)
 same => n,Set(CDR_RECORDING_FILE_OPERATOR=)
 same => n(log_it),Set(ODBC_RESULT=${ODBC_LOG_DIRECT_CALL(${UNIQUEID},${CDR_LINKED_ID},${CDR_ENTERED_TIME},${CDR_CALL_DATE},${CDR_CALL_TIME},${CDR_CALLER},${CDR_CALLED},PJSIP/${CDR_EXTENSION},${CALL_STATUS},${WAIT_TIME},${TALK_TIME},0,${CDR_TENANT_ID},${CDR_RECORDING_FILE},${CDR_RECORDING_FILE_CALLER},${CDR_RECORDING_FILE_OPERATOR})})
 same => n,NoOp(CDR logged: direct call to ${CDR_EXTENSION}, status=${CALL_STATUS}, talk=${TALK_TIME}s, recording=${CDR_RECORDING_FILE})
 same => n,Set(CDR_LOGGED=1)
 same => n(skip),Return()