mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
CgrCdr duration->usage to comply with data CDRs
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"],
|
||||
|
||||
@@ -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}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user