mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-24 00:28:44 +05:00
Adding full CDR template in exported CDRs, using RSRFields
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user