mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-23 16:18:44 +05:00
DurationMangle is now bidirectional, cdr exporter properly formating duration
This commit is contained in:
@@ -117,6 +117,8 @@ const (
|
||||
NANOSECONDS = "nanoseconds"
|
||||
SECONDS = "seconds"
|
||||
OUT = "*out"
|
||||
CDR_IMPORT = "cdr_import"
|
||||
CDR_EXPORT = "cdr_export"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -51,9 +51,14 @@ type StoredCdr struct {
|
||||
}
|
||||
|
||||
// Should only be used for display purposes, bad otherwise.
|
||||
func (storedCdr *StoredCdr) MangleDataUsage() {
|
||||
// cdrDirection: CDR_IMPORT or CDR_EXPORT
|
||||
func (storedCdr *StoredCdr) MangleDataUsage(cdrDirection string) {
|
||||
if IsSliceMember([]string{DATA, SMS}, storedCdr.TOR) {
|
||||
storedCdr.Usage = time.Duration(int(Round(storedCdr.Usage.Seconds(), 0, ROUNDING_MIDDLE))) // 0.1 should be reflected as 1 and not 0
|
||||
if cdrDirection == CDR_IMPORT { // On import CDRs usages are converted to nanoseconds, for data we need seconds, fix it here.
|
||||
storedCdr.Usage = time.Duration(storedCdr.Usage.Nanoseconds()) * time.Second
|
||||
} else if cdrDirection == CDR_EXPORT { // On exports we need to show the data back in seconds instead of internally stored as nanoseconds
|
||||
storedCdr.Usage = time.Duration(int(Round(storedCdr.Usage.Seconds(), 0, ROUNDING_MIDDLE)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,6 +122,9 @@ func (storedCdr *StoredCdr) FieldAsString(rsrFld *RSRField) string {
|
||||
case ANSWER_TIME:
|
||||
return rsrFld.ParseValue(storedCdr.AnswerTime.String())
|
||||
case USAGE:
|
||||
if IsSliceMember([]string{DATA, SMS}, storedCdr.TOR) {
|
||||
return strconv.FormatFloat(Round(storedCdr.Usage.Seconds(), 0, ROUNDING_MIDDLE), 'f', -1, 64)
|
||||
}
|
||||
return rsrFld.ParseValue(strconv.FormatInt(storedCdr.Usage.Nanoseconds(), 10))
|
||||
case MEDI_RUNID:
|
||||
return rsrFld.ParseValue(storedCdr.MediationRunId)
|
||||
|
||||
@@ -76,15 +76,27 @@ func TestFieldAsString(t *testing.T) {
|
||||
cdr.FieldAsString(&RSRField{Id: "fieldextr2"}) != cdr.ExtraFields["fieldextr2"],
|
||||
cdr.FieldAsString(&RSRField{Id: "dummy_field"}) != "")
|
||||
}
|
||||
cdr.TOR = DATA
|
||||
if formated := cdr.FieldAsString(&RSRField{Id: USAGE}); formated != "10" {
|
||||
t.Error("Wrong exported value for data field: ", formated)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMangleDataUsage(t *testing.T) {
|
||||
cdr := StoredCdr{TOR: DATA, Usage: time.Duration(1640113000000000)}
|
||||
if cdr.MangleDataUsage(); cdr.Usage != time.Duration(1640113) {
|
||||
cdr := StoredCdr{TOR: DATA, Usage: time.Duration(1640113)}
|
||||
if cdr.MangleDataUsage(CDR_IMPORT); cdr.Usage != time.Duration(1640113000000000) {
|
||||
t.Error("Unexpected usage after mangling: ", cdr.Usage)
|
||||
}
|
||||
cdr = StoredCdr{TOR: VOICE, Usage: time.Duration(1640113000000000)}
|
||||
if cdr.MangleDataUsage(); cdr.Usage != time.Duration(1640113000000000) {
|
||||
if cdr.MangleDataUsage(CDR_IMPORT); cdr.Usage != time.Duration(1640113000000000) {
|
||||
t.Error("Unexpected usage after mangling: ", cdr.Usage)
|
||||
}
|
||||
cdr = StoredCdr{TOR: DATA, Usage: time.Duration(1640113000000000)}
|
||||
if cdr.MangleDataUsage(CDR_EXPORT); cdr.Usage != time.Duration(1640113) {
|
||||
t.Error("Unexpected usage after mangling: ", cdr.Usage)
|
||||
}
|
||||
cdr = StoredCdr{TOR: VOICE, Usage: time.Duration(1640113000000000)}
|
||||
if cdr.MangleDataUsage(CDR_EXPORT); cdr.Usage != time.Duration(1640113000000000) {
|
||||
t.Error("Unexpected usage after mangling: ", cdr.Usage)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user