mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
Make sure cdr_http field is replicable with cost and cgrid, fixes #124
This commit is contained in:
@@ -21,6 +21,7 @@ package engine
|
||||
import (
|
||||
"github.com/cgrates/cgrates/utils"
|
||||
"net/http"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func NewCgrCdrFromHttpReq(req *http.Request) (CgrCdr, error) {
|
||||
@@ -40,6 +41,9 @@ func NewCgrCdrFromHttpReq(req *http.Request) (CgrCdr, error) {
|
||||
type CgrCdr map[string]string
|
||||
|
||||
func (cgrCdr CgrCdr) getCgrId() string {
|
||||
if cgrId, hasIt := cgrCdr[utils.CGRID]; hasIt {
|
||||
return cgrId
|
||||
}
|
||||
setupTime, _ := utils.ParseTimeDetectLayout(cgrCdr[utils.SETUP_TIME])
|
||||
return utils.Sha1(cgrCdr[utils.ACCID], setupTime.UTC().String())
|
||||
}
|
||||
@@ -69,10 +73,18 @@ func (cgrCdr CgrCdr) AsStoredCdr() *StoredCdr {
|
||||
storCdr.Subject = cgrCdr[utils.SUBJECT]
|
||||
storCdr.Destination = cgrCdr[utils.DESTINATION]
|
||||
storCdr.SetupTime, _ = utils.ParseTimeDetectLayout(cgrCdr[utils.SETUP_TIME]) // Not interested to process errors, should do them if necessary in a previous step
|
||||
storCdr.Pdd, _ = utils.ParseDurationWithSecs(cgrCdr[utils.PDD])
|
||||
storCdr.AnswerTime, _ = utils.ParseTimeDetectLayout(cgrCdr[utils.ANSWER_TIME])
|
||||
storCdr.Usage, _ = utils.ParseDurationWithSecs(cgrCdr[utils.USAGE])
|
||||
storCdr.Supplier = cgrCdr[utils.SUPPLIER]
|
||||
storCdr.DisconnectCause = cgrCdr[utils.DISCONNECT_CAUSE]
|
||||
storCdr.ExtraFields = cgrCdr.getExtraFields()
|
||||
storCdr.Cost = -1
|
||||
if costStr, hasIt := cgrCdr[utils.COST]; hasIt {
|
||||
storCdr.Cost, _ = strconv.ParseFloat(costStr, 64)
|
||||
}
|
||||
if ratedStr, hasIt := cgrCdr[utils.RATED]; hasIt {
|
||||
storCdr.Rated, _ = strconv.ParseBool(ratedStr)
|
||||
}
|
||||
return storCdr
|
||||
}
|
||||
|
||||
@@ -50,3 +50,37 @@ func TestCgrCdrAsStoredCdr(t *testing.T) {
|
||||
t.Errorf("Expecting %v, received: %v", expctRtCdr, storedCdr)
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure the replicated CDR matches the expected StoredCdr
|
||||
func TestReplicatedCgrCdrAsStoredCdr(t *testing.T) {
|
||||
cgrCdr := CgrCdr{utils.CGRID: "164b0422fdc6a5117031b427439482c6a4f90e41", utils.TOR: utils.VOICE, utils.ACCID: "dsafdsaf", utils.CDRHOST: "192.168.1.1",
|
||||
utils.CDRSOURCE: "internal_test", utils.REQTYPE: utils.META_RATED,
|
||||
utils.DIRECTION: utils.OUT, utils.TENANT: "cgrates.org", utils.CATEGORY: "call",
|
||||
utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "1002", utils.SETUP_TIME: "2013-11-07T08:42:20Z", utils.PDD: "0.200", utils.ANSWER_TIME: "2013-11-07T08:42:26Z",
|
||||
utils.USAGE: "10", utils.SUPPLIER: "SUPPL1", utils.DISCONNECT_CAUSE: "NORMAL_CLEARING", utils.COST: "0.12", utils.RATED: "true", "field_extr1": "val_extr1", "fieldextr2": "valextr2"}
|
||||
expctRtCdr := &StoredCdr{CgrId: cgrCdr[utils.CGRID],
|
||||
TOR: cgrCdr[utils.TOR],
|
||||
AccId: cgrCdr[utils.ACCID],
|
||||
CdrHost: cgrCdr[utils.CDRHOST],
|
||||
CdrSource: cgrCdr[utils.CDRSOURCE],
|
||||
ReqType: cgrCdr[utils.REQTYPE],
|
||||
Direction: cgrCdr[utils.DIRECTION],
|
||||
Tenant: cgrCdr[utils.TENANT],
|
||||
Category: cgrCdr[utils.CATEGORY],
|
||||
Account: cgrCdr[utils.ACCOUNT],
|
||||
Subject: cgrCdr[utils.SUBJECT],
|
||||
Destination: cgrCdr[utils.DESTINATION],
|
||||
SetupTime: time.Date(2013, 11, 7, 8, 42, 20, 0, time.UTC),
|
||||
Pdd: time.Duration(200) * time.Millisecond,
|
||||
AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC),
|
||||
Usage: time.Duration(10) * time.Second,
|
||||
Supplier: cgrCdr[utils.SUPPLIER],
|
||||
DisconnectCause: cgrCdr[utils.DISCONNECT_CAUSE],
|
||||
ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"},
|
||||
Cost: 0.12,
|
||||
Rated: true,
|
||||
}
|
||||
if storedCdr := cgrCdr.AsStoredCdr(); !reflect.DeepEqual(expctRtCdr, storedCdr) {
|
||||
t.Errorf("Expecting %v, received: %v", expctRtCdr, storedCdr)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -218,5 +218,6 @@ const (
|
||||
|
||||
var (
|
||||
CdreCdrFormats = []string{CSV, DRYRUN, CDRE_FIXED_WIDTH}
|
||||
PrimaryCdrFields = []string{TOR, ACCID, CDRHOST, CDRSOURCE, REQTYPE, DIRECTION, TENANT, CATEGORY, ACCOUNT, SUBJECT, DESTINATION, SETUP_TIME, ANSWER_TIME, USAGE, SUPPLIER}
|
||||
PrimaryCdrFields = []string{CGRID, TOR, ACCID, CDRHOST, CDRSOURCE, REQTYPE, DIRECTION, TENANT, CATEGORY, ACCOUNT, SUBJECT, DESTINATION, SETUP_TIME, PDD, ANSWER_TIME, USAGE,
|
||||
SUPPLIER, DISCONNECT_CAUSE, COST, RATED}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user