Adding full CDR template in exported CDRs, using RSRFields

This commit is contained in:
DanB
2014-03-16 13:11:08 +01:00
parent db433a760f
commit f6d16cecc5
13 changed files with 166 additions and 43 deletions

View File

@@ -82,6 +82,8 @@ const (
SETUP_TIME = "setup_time"
ANSWER_TIME = "answer_time"
DURATION = "duration"
MEDI_RUNID = "mediation_runid"
COST = "cost"
DEFAULT_RUNID = "default"
STATIC_VALUE_PREFIX = "^"
CDRE_CSV = "csv"

View File

@@ -28,9 +28,12 @@ type ReSearchReplace struct {
ReplaceTemplate string
}
func (self *ReSearchReplace) Process(source string) string {
func (rsr *ReSearchReplace) Process(source string) string {
if rsr.SearchRegexp == nil {
return ""
}
res := []byte{}
match := self.SearchRegexp.FindStringSubmatchIndex(source)
res = self.SearchRegexp.ExpandString(res, self.ReplaceTemplate, source, match)
match := rsr.SearchRegexp.FindStringSubmatchIndex(source)
res = rsr.SearchRegexp.ExpandString(res, rsr.ReplaceTemplate, source, match)
return string(res)
}

View File

@@ -25,6 +25,9 @@ type RSRField struct {
// Parse the field value from a string
func (rsrf *RSRField) ParseValue(value string) string {
if len(value) == 0 {
return value
}
if rsrf.RSRule != nil {
value = rsrf.RSRule.Process(value)
}

View File

@@ -134,6 +134,11 @@ func (storedCdr *StoredCdr) GetExtraFields() map[string]string {
return storedCdr.ExtraFields
}
// Return cost as string, formated with number of decimals configured
func (storedCdr *StoredCdr) FormatCost(roundDecimals int) string {
return strconv.FormatFloat(storedCdr.Cost, 'f', roundDecimals, 64)
}
func (storedCdr *StoredCdr) AsStoredCdr(runId, reqTypeFld, directionFld, tenantFld, torFld, accountFld, subjectFld, destFld, setupTimeFld, answerTimeFld, durationFld string, extraFlds []string, fieldsMandatory bool) (*StoredCdr, error) {
return storedCdr, nil
}
@@ -159,3 +164,43 @@ func (storedCdr *StoredCdr) AsRawCdrHttpForm() url.Values {
}
return v
}
// Used to export fields as string, primary fields are const labeled
func (storedCdr *StoredCdr) ExportFieldValue(fldName string) string {
switch fldName {
case CGRID:
return storedCdr.CgrId
case ACCID:
return storedCdr.AccId
case CDRHOST:
return storedCdr.CdrHost
case CDRSOURCE:
return storedCdr.CdrSource
case REQTYPE:
return storedCdr.ReqType
case DIRECTION:
return storedCdr.Direction
case TENANT:
return storedCdr.Tenant
case TOR:
return storedCdr.TOR
case ACCOUNT:
return storedCdr.Account
case SUBJECT:
return storedCdr.Subject
case DESTINATION:
return storedCdr.Destination
case SETUP_TIME:
return storedCdr.SetupTime.String()
case ANSWER_TIME:
return storedCdr.AnswerTime.String()
case DURATION:
return strconv.FormatFloat(storedCdr.Duration.Seconds(), 'f', -1, 64)
case MEDI_RUNID:
return storedCdr.MediationRunId
case COST:
return strconv.FormatFloat(storedCdr.Cost, 'f', -1, 64) // Recommended to use FormatCost
default:
return storedCdr.ExtraFields[fldName]
}
}

View File

@@ -148,3 +148,42 @@ func TestAsRawCdrHttpForm(t *testing.T) {
t.Errorf("Expected: %s, received: %s", ratedCdr.ExtraFields["fieldextr2"], cdrForm.Get("fieldextr2"))
}
}
func TestExportFieldValue(t *testing.T) {
cdr := StoredCdr{CgrId: FSCgrId("dsafdsaf"), AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: "test", ReqType: "rated", Direction: "*out", Tenant: "cgrates.org",
TOR: "call", Account: "1001", Subject: "1001", Destination: "1002", AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID,
Duration: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01,
}
if cdr.ExportFieldValue(CGRID) != cdr.CgrId ||
cdr.ExportFieldValue(ACCID) != cdr.AccId ||
cdr.ExportFieldValue(CDRHOST) != cdr.CdrHost ||
cdr.ExportFieldValue(CDRSOURCE) != cdr.CdrSource ||
cdr.ExportFieldValue(REQTYPE) != cdr.ReqType ||
cdr.ExportFieldValue(DIRECTION) != cdr.Direction ||
cdr.ExportFieldValue(TENANT) != cdr.Tenant ||
cdr.ExportFieldValue(TOR) != cdr.TOR ||
cdr.ExportFieldValue(ACCOUNT) != cdr.Account ||
cdr.ExportFieldValue(SUBJECT) != cdr.Subject ||
cdr.ExportFieldValue(DESTINATION) != cdr.Destination ||
cdr.ExportFieldValue(SETUP_TIME) != "0001-01-01 00:00:00 +0000 UTC" ||
cdr.ExportFieldValue(ANSWER_TIME) != cdr.AnswerTime.String() ||
cdr.ExportFieldValue(DURATION) != "10" ||
cdr.ExportFieldValue(MEDI_RUNID) != cdr.MediationRunId ||
cdr.ExportFieldValue(COST) != "1.01" ||
cdr.ExportFieldValue("field_extr1") != cdr.ExtraFields["field_extr1"] ||
cdr.ExportFieldValue("fieldextr2") != cdr.ExtraFields["fieldextr2"] ||
cdr.ExportFieldValue("dummy_field") != "" {
t.Error("Unexpected filed value received")
}
}
func TestFormatCost(t *testing.T) {
cdr := StoredCdr{Cost: 1.01}
if cdr.FormatCost(4) != "1.0100" {
t.Error("Unexpected format of the cost: ", cdr.FormatCost(4))
}
cdr = StoredCdr{Cost: 1.01001}
if cdr.FormatCost(4) != "1.0100" {
t.Error("Unexpected format of the cost: ", cdr.FormatCost(4))
}
}