(closes issue #13366)
authorSteve Murphy <murf@digium.com>
Tue, 26 Aug 2008 15:57:49 +0000 (15:57 +0000)
committerSteve Murphy <murf@digium.com>
Tue, 26 Aug 2008 15:57:49 +0000 (15:57 +0000)
Reported by: erousseau

This was a reasonable enhancement request, which was
easy to implement. Since it's an enhancement, it
could only be applied to trunk.

Basically, for accounting where "initiated" seconds
are billed for, if the microseconds field on the end
time is greater than the microseconds field for the
answer time, add one second to the billsec field.

The implementation was requested by erousseau, and
I've implemented it as requested. I've updated the
CHANGES, the cdr.conf.sample, and the .h files
accordingly, to accept and set a flag for the
corresponding new option. cdr.c adds in the extra
second based on the usec fields if the option is
set. Tested, seems to be working fine.

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

CHANGES
configs/cdr.conf.sample
include/asterisk/options.h
main/cdr.c

diff --git a/CHANGES b/CHANGES
index 38c21f5..c032471 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -209,6 +209,11 @@ Miscellaneous
     operator.  This is most helpful when working with long SQL queries in
     func_odbc.conf, as the queries no longer need to be specified on a single
     line.
+  * CDR config file, cdr.conf, has an added option, "initiatedseconds", 
+    which will add a second to the billsec when the ending
+    time is set, if the number in the microseconds field of the end time is 
+    greater than the number of microseconds in the answer time. This allows
+    users to count the 'initiated' seconds in their billing records. 
 
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 1.4.X to Asterisk 1.6.0  -------------
index 693b280..195f88f 100644 (file)
 ; retrieved inside of of this extension.
 ;endbeforehexten=no
 
+; Normally, the 'billsec' field logged to the backends (text files or databases)
+; is simply the end time (hangup time) minus the answer time in seconds. Internally,
+; asterisk stores the time in terms of microseconds and seconds. By setting 
+; initiatedseconds to 'yes', you can force asterisk to report any seconds
+; that were initiated (a sort of round up method). Technically, this is
+; when the microsecond part of the end time is greater than the microsecond
+; part of the answer time, then the billsec time is incremented one second.
+;initiatedseconds=no
+
 ;
 ;
 ; CHOOSING A CDR "BACKEND"  (what kind of output to generate)
index 19fb3ab..35f42fb 100644 (file)
@@ -84,6 +84,8 @@ enum ast_option_flags {
        AST_OPT_FLAG_VERBOSE_FILE = (1 << 24),
        /*! Terminal colors should be adjusted for a light-colored background */
        AST_OPT_FLAG_LIGHT_BACKGROUND = (1 << 25),
+       /*! Count Initiated seconds in CDR's */
+       AST_OPT_FLAG_INITIATED_SECONDS = (1 << 26),
 };
 
 /*! These are the options that set by default when Asterisk starts */
index 6bf60b8..111c3da 100644 (file)
@@ -874,8 +874,11 @@ void ast_cdr_end(struct ast_cdr *cdr)
                                ast_log(LOG_WARNING, "CDR on channel '%s' has no answer time but is 'ANSWERED'\n", S_OR(cdr->channel, "<unknown>"));
                                cdr->disposition = AST_CDR_FAILED;
                        }
-               } else
+               } else {
                        cdr->billsec = cdr->end.tv_sec - cdr->answer.tv_sec;
+                       if (ast_test_flag(&ast_options, AST_OPT_FLAG_INITIATED_SECONDS))
+                               cdr->billsec += cdr->end.tv_usec > cdr->answer.tv_usec ? 1 : 0;
+               }
        }
 }
 
@@ -1386,6 +1389,7 @@ static int do_reload(int reload)
        const char *size_value;
        const char *time_value;
        const char *end_before_h_value;
+       const char *initiatedseconds_value;
        int cfg_size;
        int cfg_time;
        int was_enabled;
@@ -1444,6 +1448,8 @@ static int do_reload(int reload)
                }
                if ((end_before_h_value = ast_variable_retrieve(config, "general", "endbeforehexten")))
                        ast_set2_flag(&ast_options, ast_true(end_before_h_value), AST_OPT_FLAG_END_CDR_BEFORE_H_EXTEN);
+               if ((initiatedseconds_value = ast_variable_retrieve(config, "general", "initiatedseconds")))
+                       ast_set2_flag(&ast_options, ast_true(initiatedseconds_value), AST_OPT_FLAG_INITIATED_SECONDS);
        }
 
        if (enabled && !batchmode) {