]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
This change modifies app_queue to properly generate CDR records in failure
authorMatthew Nicholson <mnicholson@digium.com>
Tue, 12 May 2009 22:15:45 +0000 (22:15 +0000)
committerMatthew Nicholson <mnicholson@digium.com>
Tue, 12 May 2009 22:15:45 +0000 (22:15 +0000)
situations.

This involves setting a proper cdr disposition coresponding to the given
failure condition and ensuring the proper information is stored in the cdr
record.

(closes issue #13691)
Reported by: dferrer
Tested by: mnicholson

(closes issue #13637)
Reported by: atis
Tested by: atis

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@194028 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_queue.c

index 867bfb6c0542e1aa5d43cd48f5b1bb83ec96fc4d..3660573266e7116ca7f2cfc6b9a0dfd801607b18 100644 (file)
@@ -1963,6 +1963,21 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies
                ast_copy_string(tmp->chan->exten, macroexten, sizeof(tmp->chan->exten));
        else
                ast_copy_string(tmp->chan->exten, qe->chan->exten, sizeof(tmp->chan->exten));
+       if (ast_cdr_isset_unanswered()) {
+               /* they want to see the unanswered dial attempts! */
+               /* set up the CDR fields on all the CDRs to give sensical information */
+               ast_cdr_setdestchan(tmp->chan->cdr, tmp->chan->name);
+               strcpy(tmp->chan->cdr->clid, qe->chan->cdr->clid);
+               strcpy(tmp->chan->cdr->channel, qe->chan->cdr->channel);
+               strcpy(tmp->chan->cdr->src, qe->chan->cdr->src);
+               strcpy(tmp->chan->cdr->dst, qe->chan->exten);
+               strcpy(tmp->chan->cdr->dcontext, qe->chan->context);
+               strcpy(tmp->chan->cdr->lastapp, qe->chan->cdr->lastapp);
+               strcpy(tmp->chan->cdr->lastdata, qe->chan->cdr->lastdata);
+               tmp->chan->cdr->amaflags = qe->chan->cdr->amaflags;
+               strcpy(tmp->chan->cdr->accountcode, qe->chan->cdr->accountcode);
+               strcpy(tmp->chan->cdr->userfield, qe->chan->cdr->userfield);
+       }
        ast_channel_unlock(qe->chan);
 
        /* Place the call, but don't wait on the answer */
@@ -2967,6 +2982,20 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                }
                if (option_debug && res == -1)
                        ast_log(LOG_DEBUG, "%s: Nobody answered.\n", qe->chan->name);
+               if (ast_cdr_isset_unanswered()) {
+                       /* channel contains the name of one of the outgoing channels
+                          in its CDR; zero out this CDR to avoid a dual-posting */
+                       struct callattempt *o;
+                       for (o = outgoing; o; o = o->q_next) {
+                               if (!o->chan) {
+                                       continue;
+                               }
+                               if (strcmp(o->chan->cdr->dstchannel, qe->chan->cdr->dstchannel) == 0) {
+                                       ast_set_flag(o->chan->cdr, AST_CDR_FLAG_POST_DISABLED);
+                                       break;
+                               }
+                       }
+               }
        } else { /* peer is valid */
                /* Ah ha!  Someone answered within the desired timeframe.  Of course after this
                   we will always return with -1 so that it is hung up properly after the
@@ -3036,6 +3065,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                                ast_log(LOG_NOTICE, "Caller was about to talk to agent on %s but the caller hungup.\n", peer->name);
                                ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "ABANDON", "%d|%d|%ld", qe->pos, qe->opos, (long)time(NULL) - qe->start);
                                record_abandoned(qe);
+                               ast_cdr_noanswer(qe->chan->cdr);
                                ast_hangup(peer);
                                ao2_ref(member, -1);
                                return -1;
@@ -3052,6 +3082,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                        ast_queue_log(queuename, qe->chan->uniqueid, member->membername, "SYSCOMPAT", "%s", "");
                        ast_log(LOG_WARNING, "Had to drop call because I couldn't make %s compatible with %s\n", qe->chan->name, peer->name);
                        record_abandoned(qe);
+                       ast_cdr_failed(qe->chan->cdr);
                        ast_hangup(peer);
                        ao2_ref(member, -1);
                        return -1;
@@ -4002,6 +4033,7 @@ check_turns:
                        /* Leave if we have exceeded our queuetimeout */
                        if (qe.expire && (time(NULL) >= qe.expire)) {
                                record_abandoned(&qe);
+                               ast_cdr_noanswer(qe.chan->cdr);
                                reason = QUEUE_TIMEOUT;
                                res = 0;
                                ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
@@ -4020,6 +4052,7 @@ check_turns:
                        /* Leave if we have exceeded our queuetimeout */
                        if (qe.expire && (time(NULL) >= qe.expire)) {
                                record_abandoned(&qe);
+                               ast_cdr_noanswer(qe.chan->cdr);
                                reason = QUEUE_TIMEOUT;
                                res = 0;
                                ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
@@ -4033,6 +4066,7 @@ check_turns:
                        /* Leave if we have exceeded our queuetimeout */
                        if (qe.expire && (time(NULL) >= qe.expire)) {
                                record_abandoned(&qe);
+                               ast_cdr_noanswer(qe.chan->cdr);
                                reason = QUEUE_TIMEOUT;
                                res = 0;
                                ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
@@ -4051,6 +4085,7 @@ check_turns:
                                        ast_verbose(VERBOSE_PREFIX_3 "Exiting on time-out cycle\n");
                                ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
                                record_abandoned(&qe);
+                               ast_cdr_noanswer(qe.chan->cdr);
                                reason = QUEUE_TIMEOUT;
                                res = 0;
                                break;
@@ -4059,6 +4094,7 @@ check_turns:
                        /* leave the queue if no agents, if enabled */
                        if (qe.parent->leavewhenempty && (stat == QUEUE_NO_MEMBERS)) {
                                record_abandoned(&qe);
+                               ast_cdr_noanswer(qe.chan->cdr);
                                reason = QUEUE_LEAVEEMPTY;
                                ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITEMPTY", "%d|%d|%ld", qe.pos, qe.opos, (long)(time(NULL) - qe.start));
                                res = 0;
@@ -4068,6 +4104,7 @@ check_turns:
                        /* leave the queue if no reachable agents, if enabled */
                        if ((qe.parent->leavewhenempty == QUEUE_EMPTY_STRICT) && (stat == QUEUE_NO_REACHABLE_MEMBERS)) {
                                record_abandoned(&qe);
+                               ast_cdr_noanswer(qe.chan->cdr);
                                reason = QUEUE_LEAVEUNAVAIL;
                                ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITEMPTY", "%d|%d|%ld", qe.pos, qe.opos, (long)(time(NULL) - qe.start));
                                res = 0;
@@ -4077,6 +4114,7 @@ check_turns:
                        /* Leave if we have exceeded our queuetimeout */
                        if (qe.expire && (time(NULL) >= qe.expire)) {
                                record_abandoned(&qe);
+                               ast_cdr_noanswer(qe.chan->cdr);
                                reason = QUEUE_TIMEOUT;
                                res = 0;
                                ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
@@ -4108,6 +4146,7 @@ stop:
                        if (res < 0) {
                                if (!qe.handled) {
                                        record_abandoned(&qe);
+                                       ast_cdr_noanswer(qe.chan->cdr);
                                        ast_queue_log(args.queuename, chan->uniqueid, "NONE", "ABANDON",
                                                "%d|%d|%ld", qe.pos, qe.opos,
                                                (long) time(NULL) - qe.start);