summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Murphy <murf@digium.com>2008-08-26 15:57:49 +0000
committerSteve Murphy <murf@digium.com>2008-08-26 15:57:49 +0000
commit8953b0f3594eb43530530162729f7cee19e07db0 (patch)
tree5f9704b71c74cf16ea793f7706374e97f6f4a491
parentb296adfe8e48d57a351d1b21ccc2bff57df326f6 (diff)
(closes issue #13366)
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
-rw-r--r--CHANGES5
-rw-r--r--configs/cdr.conf.sample9
-rw-r--r--include/asterisk/options.h2
-rw-r--r--main/cdr.c8
4 files changed, 23 insertions, 1 deletions
diff --git a/CHANGES b/CHANGES
index 38c21f590..c032471d0 100644
--- 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 -------------
diff --git a/configs/cdr.conf.sample b/configs/cdr.conf.sample
index 693b28092..195f88f32 100644
--- a/configs/cdr.conf.sample
+++ b/configs/cdr.conf.sample
@@ -65,6 +65,15 @@
; 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)
diff --git a/include/asterisk/options.h b/include/asterisk/options.h
index 19fb3ab59..35f42fb25 100644
--- a/include/asterisk/options.h
+++ b/include/asterisk/options.h
@@ -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 */
diff --git a/main/cdr.c b/main/cdr.c
index 6bf60b8a7..111c3daf0 100644
--- a/main/cdr.c
+++ b/main/cdr.c
@@ -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) {