]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
(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 38c21f59004b2d1c245f25fd2ab5c16eec1eb2e0..c032471d0e9bb5a0560c9e08555194b6d507667a 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 693b2809288534678bd5ec71866f54ce289d8123..195f88f32a4d906a97c0795cfd62f589d4cfa2b3 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 19fb3ab59cfb57e45964791b930b6c3c85b776c5..35f42fb25a4238c44f42770cbb623b95d362955c 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 6bf60b8a7c261a3815ec034a0d36bf55add46dcc..111c3daf0a236848de3a79eabe231209b03f08ee 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) {