diff --git a/utils/consts.go b/utils/consts.go index f410e311a..96b893baa 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -93,6 +93,8 @@ const ( ANSWER_TIME = "answer_time" USAGE = "usage" MEDI_RUNID = "mediation_runid" + RATED_ACCOUNT = "rated_account" + RATED_SUBJECT = "rated_subject" COST = "cost" DEFAULT_RUNID = "default" STATIC_VALUE_PREFIX = "^" diff --git a/utils/storedcdr.go b/utils/storedcdr.go index f4c1471ab..74e43dc68 100644 --- a/utils/storedcdr.go +++ b/utils/storedcdr.go @@ -128,6 +128,10 @@ func (storedCdr *StoredCdr) FieldAsString(rsrFld *RSRField) string { return rsrFld.ParseValue(strconv.FormatInt(storedCdr.Usage.Nanoseconds(), 10)) case MEDI_RUNID: return rsrFld.ParseValue(storedCdr.MediationRunId) + case RATED_ACCOUNT: + return rsrFld.ParseValue(storedCdr.RatedAccount) + case RATED_SUBJECT: + return rsrFld.ParseValue(storedCdr.RatedSubject) case COST: return rsrFld.ParseValue(strconv.FormatFloat(storedCdr.Cost, 'f', -1, 64)) // Recommended to use FormatCost default: @@ -159,7 +163,7 @@ func (storedCdr *StoredCdr) AsStoredCdr() *StoredCdr { return storedCdr } -// Ability to send the CgrCdr remotely to another CDR server +// Ability to send the CgrCdr remotely to another CDR server, we do not include rating variables for now func (storedCdr *StoredCdr) AsHttpForm() url.Values { v := url.Values{} for fld, val := range storedCdr.ExtraFields { @@ -326,6 +330,8 @@ func (storedCdr *StoredCdr) AsCgrCdrOut() *CgrCdrOut { Usage: storedCdr.Usage.Seconds(), ExtraFields: storedCdr.ExtraFields, MediationRunId: storedCdr.MediationRunId, + RatedAccount: storedCdr.RatedAccount, + RatedSubject: storedCdr.RatedSubject, Cost: storedCdr.Cost, } } @@ -349,5 +355,7 @@ type CgrCdrOut struct { Usage float64 ExtraFields map[string]string MediationRunId string + RatedAccount string + RatedSubject string Cost float64 } diff --git a/utils/storedcdr_test.go b/utils/storedcdr_test.go index 62a3bf97c..8e33a591e 100644 --- a/utils/storedcdr_test.go +++ b/utils/storedcdr_test.go @@ -32,7 +32,7 @@ func TestStoredCdrInterfaces(t *testing.T) { func TestFieldAsString(t *testing.T) { cdr := StoredCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: "test", ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, + Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", } if cdr.FieldAsString(&RSRField{Id: CGRID}) != cdr.CgrId || cdr.FieldAsString(&RSRField{Id: ORDERID}) != "123" || @@ -51,6 +51,8 @@ func TestFieldAsString(t *testing.T) { cdr.FieldAsString(&RSRField{Id: USAGE}) != "10000000000" || cdr.FieldAsString(&RSRField{Id: MEDI_RUNID}) != cdr.MediationRunId || cdr.FieldAsString(&RSRField{Id: COST}) != "1.01" || + cdr.FieldAsString(&RSRField{Id: RATED_ACCOUNT}) != "dan" || + cdr.FieldAsString(&RSRField{Id: RATED_SUBJECT}) != "dans" || cdr.FieldAsString(&RSRField{Id: "field_extr1"}) != cdr.ExtraFields["field_extr1"] || cdr.FieldAsString(&RSRField{Id: "fieldextr2"}) != cdr.ExtraFields["fieldextr2"] || cdr.FieldAsString(&RSRField{Id: "dummy_field"}) != "" { @@ -71,6 +73,8 @@ func TestFieldAsString(t *testing.T) { cdr.FieldAsString(&RSRField{Id: ANSWER_TIME}) != cdr.AnswerTime.String(), cdr.FieldAsString(&RSRField{Id: USAGE}) != "10000000000", cdr.FieldAsString(&RSRField{Id: MEDI_RUNID}) != cdr.MediationRunId, + cdr.FieldAsString(&RSRField{Id: RATED_ACCOUNT}) != "dan", + cdr.FieldAsString(&RSRField{Id: RATED_SUBJECT}) != "dans", cdr.FieldAsString(&RSRField{Id: COST}) != "1.01", cdr.FieldAsString(&RSRField{Id: "field_extr1"}) != cdr.ExtraFields["field_extr1"], cdr.FieldAsString(&RSRField{Id: "fieldextr2"}) != cdr.ExtraFields["fieldextr2"], @@ -234,7 +238,7 @@ func TestStoredCdrAsHttpForm(t *testing.T) { storCdr := StoredCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: UNIT_TEST, ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, + Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, RatedSubject: "dans", Cost: 1.01, } cdrForm := storCdr.AsHttpForm() if cdrForm.Get(TOR) != VOICE { @@ -291,7 +295,7 @@ func TestStoredCdrForkCdr(t *testing.T) { storCdr := StoredCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: UNIT_TEST, ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID, - Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "field_extr2": "valextr2"}, Cost: 1.01, + Usage: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "field_extr2": "valextr2"}, Cost: 1.01, RatedSubject: "dans", } rtSampleCdrOut, err := storCdr.ForkCdr("sample_run1", &RSRField{Id: REQTYPE}, &RSRField{Id: DIRECTION}, &RSRField{Id: TENANT}, &RSRField{Id: CATEGORY}, &RSRField{Id: ACCOUNT}, &RSRField{Id: SUBJECT}, &RSRField{Id: DESTINATION}, &RSRField{Id: SETUP_TIME}, &RSRField{Id: ANSWER_TIME}, &RSRField{Id: USAGE}, @@ -379,12 +383,12 @@ func TestStoredCdrAsCgrCdrOut(t *testing.T) { storCdr := StoredCdr{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: UNIT_TEST, ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID, - Usage: time.Duration(10), ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, + Usage: time.Duration(10), ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", } expectOutCdr := &CgrCdrOut{CgrId: Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC).String()), OrderId: 123, TOR: VOICE, AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: UNIT_TEST, ReqType: "rated", Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002", SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC), AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC), MediationRunId: DEFAULT_RUNID, - Usage: 0.00000001, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, + Usage: 0.00000001, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01, RatedAccount: "dan", RatedSubject: "dans", } if cdrOut := storCdr.AsCgrCdrOut(); !reflect.DeepEqual(expectOutCdr, cdrOut) { t.Errorf("Expected: %+v, received: %+v", expectOutCdr, cdrOut)