From aaeac3329a2ec7273959b74a052c30aacb653a1b Mon Sep 17 00:00:00 2001 From: DanB Date: Sun, 18 May 2014 22:04:16 +0200 Subject: [PATCH] CgrCdr duration->usage to comply with data CDRs --- apier/apier_local_test.go | 8 ++++---- mediator/mediator.go | 8 ++++---- mediator/mediator_local_test.go | 12 ++++++++---- utils/cgrcdr.go | 2 +- utils/cgrcdr_test.go | 2 +- utils/consts.go | 3 ++- 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/apier/apier_local_test.go b/apier/apier_local_test.go index a7d3bbb50..4964887d8 100644 --- a/apier/apier_local_test.go +++ b/apier/apier_local_test.go @@ -1614,10 +1614,10 @@ func TestLocalGetDataCost(t *testing.T) { } attrs := AttrGetDataCost{Direction: "*out", Category: "data", Tenant: "cgrates.org", Account: "1001", Subject: "1001", StartTime: time.Now(), Usage: 640113} var rply *engine.DataCost - if err := rater.Call("ApierV1.GetDataCost", attrs, &rply); err == nil { - t.Error("Should give out error") - } else if err.Error() != "SERVER_ERROR:Could not determine rating plans for call" { - t.Error("Unexpected error: ", err.Error()) + if err := rater.Call("ApierV1.GetDataCost", attrs, &rply); err != nil { + t.Error("Unexpected nil error received: ", err.Error()) + } else if rply.Cost != 128.03 { + t.Errorf("Unexpected cost received: %f", rply.Cost) } } diff --git a/mediator/mediator.go b/mediator/mediator.go index b068a4391..3cd402f87 100644 --- a/mediator/mediator.go +++ b/mediator/mediator.go @@ -58,14 +58,15 @@ func (self *Mediator) getCostsFromDB(cgrid, runId string) (cc *engine.CallCost, } // Retrive the cost from engine -func (self *Mediator) getCostsVoiceFromRater(storedCdr *utils.StoredCdr) (*engine.CallCost, error) { +func (self *Mediator) getCostFromRater(storedCdr *utils.StoredCdr) (*engine.CallCost, error) { cc := &engine.CallCost{} var err error if storedCdr.Duration == time.Duration(0) { // failed call, returning empty callcost, no error return cc, nil } cd := engine.CallDescriptor{ - Direction: "*out", //record[m.directionFields[runIdx]] TODO: fix me + TOR: storedCdr.TOR, + Direction: storedCdr.Direction, Tenant: storedCdr.Tenant, Category: storedCdr.Category, Subject: storedCdr.Subject, @@ -73,7 +74,6 @@ func (self *Mediator) getCostsVoiceFromRater(storedCdr *utils.StoredCdr) (*engin Destination: storedCdr.Destination, TimeStart: storedCdr.AnswerTime, TimeEnd: storedCdr.AnswerTime.Add(storedCdr.Duration), - LoopIndex: 0, DurationIndex: storedCdr.Duration, } if storedCdr.ReqType == utils.PSEUDOPREPAID { @@ -97,7 +97,7 @@ func (self *Mediator) rateCDR(storedCdr *utils.StoredCdr) error { // Should be previously calculated and stored in DB qryCC, errCost = self.getCostsFromDB(storedCdr.CgrId, storedCdr.MediationRunId) } else if storedCdr.TOR == utils.VOICE { - qryCC, errCost = self.getCostsVoiceFromRater(storedCdr) + qryCC, errCost = self.getCostFromRater(storedCdr) } else { return fmt.Errorf("Unsupported TOR: %s", storedCdr.TOR) } diff --git a/mediator/mediator_local_test.go b/mediator/mediator_local_test.go index 475fa335d..9963a179e 100644 --- a/mediator/mediator_local_test.go +++ b/mediator/mediator_local_test.go @@ -139,10 +139,14 @@ func TestPostCdrs(t *testing.T) { cdrForm1 := url.Values{utils.TOR: []string{utils.VOICE}, utils.ACCID: []string{"dsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{"rated"}, utils.DIRECTION: []string{"*out"}, utils.TENANT: []string{"cgrates.org"}, utils.CATEGORY: []string{"call"}, utils.ACCOUNT: []string{"1001"}, utils.SUBJECT: []string{"1001"}, utils.DESTINATION: []string{"+4986517174963"}, - utils.ANSWER_TIME: []string{"2013-11-07T08:42:26Z"}, utils.DURATION: []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}} + utils.ANSWER_TIME: []string{"2013-11-07T08:42:26Z"}, utils.USAGE: []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}} cdrForm2 := url.Values{utils.TOR: []string{utils.VOICE}, utils.ACCID: []string{"adsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{"rated"}, utils.DIRECTION: []string{"*out"}, utils.TENANT: []string{"itsyscom.com"}, utils.CATEGORY: []string{"call"}, utils.ACCOUNT: []string{"1003"}, utils.SUBJECT: []string{"1003"}, utils.DESTINATION: []string{"+4986517174964"}, - utils.ANSWER_TIME: []string{"2013-11-07T08:42:26Z"}, utils.DURATION: []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}} + utils.ANSWER_TIME: []string{"2013-11-07T08:42:26Z"}, utils.USAGE: []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}} + //cdrFormData1 := url.Values{utils.TOR: []string{utils.DATA}, utils.ACCID: []string{"616350843"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{"rated"}, + // utils.DIRECTION: []string{"*out"}, utils.TENANT: []string{"cgrates.org"}, utils.CATEGORY: []string{"data"}, + // utils.ACCOUNT: []string{"1010"}, utils.SUBJECT: []string{"1010"}, utils.ANSWER_TIME: []string{"2013-11-07T08:42:26Z"}, + // utils.USAGE: []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}} for _, cdrForm := range []url.Values{cdrForm1, cdrForm2} { cdrForm.Set(utils.CDRSOURCE, engine.TEST_SQL) if _, err := httpClient.PostForm(fmt.Sprintf("http://%s/cgr", cfg.HTTPListen), cdrForm); err != nil { @@ -169,10 +173,10 @@ func TestInjectCdrs(t *testing.T) { } cgrCdr1 := utils.CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaaaadsafdsaf", "cdrsource": engine.TEST_SQL, utils.CDRHOST: "192.168.1.1", utils.REQTYPE: "rated", utils.DIRECTION: "*out", utils.TENANT: "cgrates.org", utils.CATEGORY: "call", utils.ACCOUNT: "dan", utils.SUBJECT: "dan", utils.DESTINATION: "+4986517174963", - utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.DURATION: "10"} + utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "10"} cgrCdr2 := utils.CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "baaaadsafdsaf", "cdrsource": engine.TEST_SQL, utils.CDRHOST: "192.168.1.1", utils.REQTYPE: "rated", utils.DIRECTION: "*out", utils.TENANT: "cgrates.org", utils.CATEGORY: "call", utils.ACCOUNT: "dan", utils.SUBJECT: "dan", utils.DESTINATION: "+4986517173964", - utils.ANSWER_TIME: "2013-11-07T09:42:26Z", utils.DURATION: "20"} + utils.ANSWER_TIME: "2013-11-07T09:42:26Z", utils.USAGE: "20"} for _, cdr := range []utils.CgrCdr{cgrCdr1, cgrCdr2} { if err := cdrStor.SetCdr(cdr.AsStoredCdr()); err != nil { t.Error(err) diff --git a/utils/cgrcdr.go b/utils/cgrcdr.go index 64a65cbf3..efc96d1c8 100644 --- a/utils/cgrcdr.go +++ b/utils/cgrcdr.go @@ -69,7 +69,7 @@ func (cgrCdr CgrCdr) AsStoredCdr() *StoredCdr { storCdr.Destination = cgrCdr[DESTINATION] storCdr.SetupTime, _ = ParseTimeDetectLayout(cgrCdr[SETUP_TIME]) // Not interested to process errors, should do them if necessary in a previous step storCdr.AnswerTime, _ = ParseTimeDetectLayout(cgrCdr[ANSWER_TIME]) - storCdr.Duration, _ = ParseDurationWithSecs(cgrCdr[DURATION]) + storCdr.Duration, _ = ParseDurationWithSecs(cgrCdr[USAGE]) storCdr.ExtraFields = cgrCdr.getExtraFields() storCdr.Cost = -1 return storCdr diff --git a/utils/cgrcdr_test.go b/utils/cgrcdr_test.go index 485cda87b..f1c4f2bd3 100644 --- a/utils/cgrcdr_test.go +++ b/utils/cgrcdr_test.go @@ -34,7 +34,7 @@ func TestCgrCdrInterfaces(t *testing.T) { func TestCgrCdrAsStoredCdr(t *testing.T) { cgrCdr := CgrCdr{TOR: VOICE, ACCID: "dsafdsaf", CDRHOST: "192.168.1.1", CDRSOURCE: "internal_test", REQTYPE: "rated", DIRECTION: "*out", TENANT: "cgrates.org", CATEGORY: "call", - ACCOUNT: "1001", SUBJECT: "1001", DESTINATION: "1002", SETUP_TIME: "2013-11-07T08:42:20Z", ANSWER_TIME: "2013-11-07T08:42:26Z", DURATION: "10", + ACCOUNT: "1001", SUBJECT: "1001", DESTINATION: "1002", SETUP_TIME: "2013-11-07T08:42:20Z", ANSWER_TIME: "2013-11-07T08:42:26Z", USAGE: "10", "field_extr1": "val_extr1", "fieldextr2": "valextr2"} setupTime, _ := ParseTimeDetectLayout(cgrCdr["setup_time"]) expctRtCdr := &StoredCdr{CgrId: Sha1(cgrCdr["accid"], setupTime.String()), TOR: VOICE, AccId: cgrCdr["accid"], CdrHost: cgrCdr["cdrhost"], CdrSource: cgrCdr["cdrsource"], ReqType: cgrCdr["reqtype"], diff --git a/utils/consts.go b/utils/consts.go index df56a4add..08b6e2a2c 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -88,6 +88,7 @@ const ( SETUP_TIME = "setup_time" ANSWER_TIME = "answer_time" DURATION = "duration" + USAGE = "usage" MEDI_RUNID = "mediation_runid" COST = "cost" DEFAULT_RUNID = "default" @@ -120,5 +121,5 @@ const ( var ( CdreCdrFormats = []string{CSV, CDRE_DRYRUN, CDRE_FIXED_WIDTH} - PrimaryCdrFields = []string{TOR, ACCID, CDRHOST, CDRSOURCE, REQTYPE, DIRECTION, TENANT, CATEGORY, ACCOUNT, SUBJECT, DESTINATION, SETUP_TIME, ANSWER_TIME, DURATION} + PrimaryCdrFields = []string{TOR, ACCID, CDRHOST, CDRSOURCE, REQTYPE, DIRECTION, TENANT, CATEGORY, ACCOUNT, SUBJECT, DESTINATION, SETUP_TIME, ANSWER_TIME, USAGE} )