From a88a9fcf7e41ab052eef5258d5fb1e17ef3678a9 Mon Sep 17 00:00:00 2001 From: DanB Date: Tue, 3 Jan 2017 17:16:22 +0100 Subject: [PATCH] Adding RoundingDecimals in CdrExport APIs --- cdrc/partial_cdr.go | 2 +- cdre/cdrexporter.go | 22 +++++++++++----------- engine/cdr.go | 8 +++++++- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/cdrc/partial_cdr.go b/cdrc/partial_cdr.go index e32f87a50..b330cd237 100644 --- a/cdrc/partial_cdr.go +++ b/cdrc/partial_cdr.go @@ -68,7 +68,7 @@ func (prc *PartialRecordsCache) dumpPartialRecords(originID string) { csvWriter := csv.NewWriter(fileOut) csvWriter.Comma = prc.csvSep for _, cdr := range prc.partialRecords[originID].cdrs { - expRec, err := cdr.AsExportRecord(prc.partialRecords[originID].cacheDumpFields, prc.httpSkipTlsCheck, nil) + expRec, err := cdr.AsExportRecord(prc.partialRecords[originID].cacheDumpFields, prc.httpSkipTlsCheck, nil, prc.roundDecimals) if err != nil { return nil, err } diff --git a/cdre/cdrexporter.go b/cdre/cdrexporter.go index 2b208a0d6..f08445834 100644 --- a/cdre/cdrexporter.go +++ b/cdre/cdrexporter.go @@ -49,7 +49,7 @@ var err error func NewCdrExporter(cdrs []*engine.CDR, cdrDb engine.CdrStorage, exportTpl *config.CdreConfig, cdrFormat string, fieldSeparator rune, exportId string, dataUsageMultiplyFactor, smsUsageMultiplyFactor, mmsUsageMultiplyFactor, genericUsageMultiplyFactor, costMultiplyFactor float64, - cgrPrecision int, httpSkipTlsCheck bool) (*CdrExporter, error) { + roundingDecimals int, httpSkipTlsCheck bool) (*CdrExporter, error) { if len(cdrs) == 0 { // Nothing to export return nil, nil } @@ -65,7 +65,7 @@ func NewCdrExporter(cdrs []*engine.CDR, cdrDb engine.CdrStorage, exportTpl *conf mmsUsageMultiplyFactor: mmsUsageMultiplyFactor, genericUsageMultiplyFactor: genericUsageMultiplyFactor, costMultiplyFactor: costMultiplyFactor, - cgrPrecision: cgrPrecision, + roundingDecimals: roundingDecimals, httpSkipTlsCheck: httpSkipTlsCheck, negativeExports: make(map[string]string), } @@ -87,7 +87,7 @@ type CdrExporter struct { mmsUsageMultiplyFactor, genericUsageMultiplyFactor, costMultiplyFactor float64 - cgrPrecision int + roundingDecimals int httpSkipTlsCheck bool header, trailer []string // Header and Trailer fields content [][]string // Rows of cdr fields @@ -131,7 +131,7 @@ func (cdre *CdrExporter) metaHandler(tag, arg string) (string, error) { emulatedCdr := &engine.CDR{ToR: utils.DATA, Usage: cdre.totalDataUsage} return emulatedCdr.FormatUsage(arg), nil case META_COSTCDRS: - return strconv.FormatFloat(utils.Round(cdre.totalCost, cdre.cgrPrecision, utils.ROUNDING_MIDDLE), 'f', -1, 64), nil + return strconv.FormatFloat(utils.Round(cdre.totalCost, cdre.roundingDecimals, utils.ROUNDING_MIDDLE), 'f', -1, 64), nil default: return "", fmt.Errorf("Unsupported METATAG: %s", tag) } @@ -204,18 +204,18 @@ func (cdre *CdrExporter) processCdr(cdr *engine.CDR) error { } // Cost multiply if cdre.dataUsageMultiplyFactor != 0.0 && cdr.ToR == utils.DATA { - cdr.UsageMultiply(cdre.dataUsageMultiplyFactor, cdre.cgrPrecision) + cdr.UsageMultiply(cdre.dataUsageMultiplyFactor, cdre.roundingDecimals) } else if cdre.smsUsageMultiplyFactor != 0 && cdr.ToR == utils.SMS { - cdr.UsageMultiply(cdre.smsUsageMultiplyFactor, cdre.cgrPrecision) + cdr.UsageMultiply(cdre.smsUsageMultiplyFactor, cdre.roundingDecimals) } else if cdre.mmsUsageMultiplyFactor != 0 && cdr.ToR == utils.MMS { - cdr.UsageMultiply(cdre.mmsUsageMultiplyFactor, cdre.cgrPrecision) + cdr.UsageMultiply(cdre.mmsUsageMultiplyFactor, cdre.roundingDecimals) } else if cdre.genericUsageMultiplyFactor != 0 && cdr.ToR == utils.GENERIC { - cdr.UsageMultiply(cdre.genericUsageMultiplyFactor, cdre.cgrPrecision) + cdr.UsageMultiply(cdre.genericUsageMultiplyFactor, cdre.roundingDecimals) } if cdre.costMultiplyFactor != 0.0 { - cdr.CostMultiply(cdre.costMultiplyFactor, cdre.cgrPrecision) + cdr.CostMultiply(cdre.costMultiplyFactor, cdre.roundingDecimals) } - cdrRow, err := cdr.AsExportRecord(cdre.exportTemplate.ContentFields, cdre.httpSkipTlsCheck, cdre.cdrs) + cdrRow, err := cdr.AsExportRecord(cdre.exportTemplate.ContentFields, cdre.httpSkipTlsCheck, cdre.cdrs, cdre.roundingDecimals) if err != nil { utils.Logger.Err(fmt.Sprintf(" Cannot export CDR with CGRID: %s and runid: %s, error: %s", cdr.CGRID, cdr.RunID, err.Error())) return err @@ -250,7 +250,7 @@ func (cdre *CdrExporter) processCdr(cdr *engine.CDR) error { } if cdr.Cost != -1 { cdre.totalCost += cdr.Cost - cdre.totalCost = utils.Round(cdre.totalCost, cdre.cgrPrecision, utils.ROUNDING_MIDDLE) + cdre.totalCost = utils.Round(cdre.totalCost, cdre.roundingDecimals, utils.ROUNDING_MIDDLE) } if cdre.firstExpOrderId > cdr.OrderID || cdre.firstExpOrderId == 0 { cdre.firstExpOrderId = cdr.OrderID diff --git a/engine/cdr.go b/engine/cdr.go index 55b9a5662..3f93fe7b3 100644 --- a/engine/cdr.go +++ b/engine/cdr.go @@ -794,9 +794,15 @@ func (cdr *CDR) formatField(cfgFld *config.CfgCdrField, httpSkipTlsCheck bool, g // Used in place where we need to export the CDR based on an export template // ExportRecord is a []string to keep it compatible with encoding/csv Writer -func (cdr *CDR) AsExportRecord(exportFields []*config.CfgCdrField, httpSkipTlsCheck bool, groupedCDRs []*CDR) (expRecord []string, err error) { +func (cdr *CDR) AsExportRecord(exportFields []*config.CfgCdrField, httpSkipTlsCheck bool, groupedCDRs []*CDR, roundingDecs int) (expRecord []string, err error) { expRecord = make([]string, len(exportFields)) for idx, cfgFld := range exportFields { + if roundingDecs != 0 { + clnFld := new(config.CfgCdrField) // Clone so we can modify the rounding decimals without affecting the template + *clnFld = *cfgFld + clnFld.RoundingDecimals = roundingDecs + cfgFld = clnFld + } if fmtOut, err := cdr.formatField(cfgFld, httpSkipTlsCheck, groupedCDRs); err != nil { return nil, err } else {