mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-12 18:46:24 +05:00
Updated v1ProcessCDR and V1RateCDR
This commit is contained in:
@@ -1397,6 +1397,25 @@ func TestApierResetDataAfterLoadFromFolder(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApierSetChargerS(t *testing.T) {
|
||||
//add a default charger
|
||||
chargerProfile := &ChargerWithCache{
|
||||
ChargerProfile: &engine.ChargerProfile{
|
||||
Tenant: "cgrates.org",
|
||||
ID: "Default",
|
||||
RunID: utils.MetaDefault,
|
||||
AttributeIDs: []string{"*none"},
|
||||
Weight: 20,
|
||||
},
|
||||
}
|
||||
var result string
|
||||
if err := rater.Call(utils.ApierV1SetChargerProfile, chargerProfile, &result); err != nil {
|
||||
t.Error(err)
|
||||
} else if result != utils.OK {
|
||||
t.Error("Unexpected reply returned", result)
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure balance was topped-up
|
||||
// Bug reported by DigiDaz over IRC
|
||||
func TestApierGetAccountAfterLoad(t *testing.T) {
|
||||
@@ -1435,7 +1454,6 @@ func TestApierResponderGetCost(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestApierMaxDebitInexistentAcnt(t *testing.T) {
|
||||
|
||||
cc := &engine.CallCost{}
|
||||
cd := &engine.CallDescriptorWithArgDispatcher{
|
||||
CallDescriptor: &engine.CallDescriptor{
|
||||
@@ -1454,7 +1472,6 @@ func TestApierMaxDebitInexistentAcnt(t *testing.T) {
|
||||
if err := rater.Call(utils.ResponderDebit, cd, cc); err == nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestApierCdrServer(t *testing.T) {
|
||||
@@ -1478,7 +1495,7 @@ func TestApierCdrServer(t *testing.T) {
|
||||
|
||||
func TestApierITGetCdrs(t *testing.T) {
|
||||
var reply []*engine.ExternalCDR
|
||||
req := utils.AttrGetCdrs{MediationRunIds: []string{utils.MetaRaw}}
|
||||
req := utils.AttrGetCdrs{MediationRunIds: []string{utils.MetaDefault}}
|
||||
if err := rater.Call(utils.ApierV1GetCDRs, req, &reply); err != nil {
|
||||
t.Error("Unexpected error: ", err.Error())
|
||||
} else if len(reply) != 2 {
|
||||
@@ -1487,22 +1504,6 @@ func TestApierITGetCdrs(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestApierITProcessCdr(t *testing.T) {
|
||||
//add a default charger
|
||||
chargerProfile := &ChargerWithCache{
|
||||
ChargerProfile: &engine.ChargerProfile{
|
||||
Tenant: "cgrates.org",
|
||||
ID: "Default",
|
||||
RunID: utils.MetaDefault,
|
||||
AttributeIDs: []string{"*none"},
|
||||
Weight: 20,
|
||||
},
|
||||
}
|
||||
var result string
|
||||
if err := rater.Call(utils.ApierV1SetChargerProfile, chargerProfile, &result); err != nil {
|
||||
t.Error(err)
|
||||
} else if result != utils.OK {
|
||||
t.Error("Unexpected reply returned", result)
|
||||
}
|
||||
var reply string
|
||||
cdr := &engine.CDRWithArgDispatcher{
|
||||
CDR: &engine.CDR{CGRID: utils.Sha1("dsafdsaf", time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC).String()), OrderID: 123, ToR: utils.VOICE, OriginID: "dsafdsaf",
|
||||
@@ -1518,7 +1519,7 @@ func TestApierITProcessCdr(t *testing.T) {
|
||||
t.Error("Unexpected reply received: ", reply)
|
||||
}
|
||||
var cdrs []*engine.ExternalCDR
|
||||
req := utils.AttrGetCdrs{MediationRunIds: []string{utils.MetaRaw}}
|
||||
req := utils.AttrGetCdrs{MediationRunIds: []string{utils.MetaDefault}}
|
||||
if err := rater.Call(utils.ApierV1GetCDRs, req, &cdrs); err != nil {
|
||||
t.Error("Unexpected error: ", err.Error())
|
||||
} else if len(cdrs) != 3 {
|
||||
|
||||
@@ -208,7 +208,7 @@ func testCDReProcessExternalCdr(t *testing.T) {
|
||||
args := utils.RPCCDRsFilter{OriginIDs: []string{"testextcdr1"}}
|
||||
if err := cdreRPC.Call(utils.ApierV2GetCDRs, args, &cdrs); err != nil {
|
||||
t.Error("Unexpected error: ", err.Error())
|
||||
} else if len(cdrs) != 2 {
|
||||
} else if len(cdrs) != 1 {
|
||||
t.Errorf("Unexpected number of CDRs returned: %v, cdrs=%s ", len(cdrs), utils.ToJSON(cdrs))
|
||||
return
|
||||
} else {
|
||||
@@ -322,11 +322,11 @@ func testCDReExportCDRsWithAttributes(t *testing.T) {
|
||||
} else if len(rply.ExportedCGRIDs) != 2 {
|
||||
t.Errorf("Unexpected number of CDR exported: %s ", utils.ToJSON(rply))
|
||||
}
|
||||
fileContent1 := `Cdr3,*raw,test2,OriginCDR3,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,30s,-1.0000
|
||||
Cdr2,*raw,test2,OriginCDR2,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,5s,-1.0000
|
||||
fileContent1 := `Cdr3,*default,test2,OriginCDR3,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,30s,-1.0000
|
||||
Cdr2,*default,test2,OriginCDR2,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,5s,-1.0000
|
||||
`
|
||||
fileContent2 := `Cdr2,*raw,test2,OriginCDR2,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,5s,-1.0000
|
||||
Cdr3,*raw,test2,OriginCDR3,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,30s,-1.0000
|
||||
fileContent2 := `Cdr2,*default,test2,OriginCDR2,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,5s,-1.0000
|
||||
Cdr3,*default,test2,OriginCDR3,cgrates.org,ATTR_CATEGORY,1001,ATTR_SUBJECT,+4986517174963,30s,-1.0000
|
||||
`
|
||||
if outContent1, err := ioutil.ReadFile(rply.ExportedPath); err != nil {
|
||||
t.Error(err)
|
||||
|
||||
@@ -687,6 +687,7 @@ func testV2CDRsGetCdrsWithRattingPlan(t *testing.T) {
|
||||
t.Errorf("Unexpected cost for CDR: %f", cdrs[0].Cost)
|
||||
}
|
||||
}
|
||||
cdrs = []*engine.ExternalCDR{} // gob will not update zero value fields
|
||||
args = utils.RPCCDRsFilter{RunIDs: []string{"CustomerCharges"}, Accounts: []string{"testV2CDRsProcessCDR4"}}
|
||||
if err := cdrsRpc.Call(utils.ApierV2GetCDRs, args, &cdrs); err != nil {
|
||||
t.Error("Unexpected error: ", err.Error())
|
||||
@@ -700,6 +701,7 @@ func testV2CDRsGetCdrsWithRattingPlan(t *testing.T) {
|
||||
t.Errorf("Expected ExtraInfo : %s received :%s", "", cdrs[0].ExtraInfo)
|
||||
}
|
||||
}
|
||||
cdrs = []*engine.ExternalCDR{} // gob will not update zero value fields
|
||||
args = utils.RPCCDRsFilter{RunIDs: []string{"SupplierCharges"}, Accounts: []string{"testV2CDRsProcessCDR4"}}
|
||||
if err := cdrsRpc.Call(utils.ApierV2GetCDRs, args, &cdrs); err != nil {
|
||||
t.Error("Unexpected error: ", err.Error())
|
||||
|
||||
@@ -69,11 +69,6 @@
|
||||
},
|
||||
|
||||
|
||||
"chargers": {
|
||||
"enabled": true,
|
||||
"attributes_conns": ["*internal"],
|
||||
},
|
||||
|
||||
"apier": {
|
||||
"caches_conns":["*internal"],
|
||||
"scheduler_conns": ["*internal"],
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
|
||||
"cdrs": {
|
||||
"enabled": true,
|
||||
"chargers_conns":["*internal"],
|
||||
"rals_conns": ["*internal"],
|
||||
},
|
||||
|
||||
|
||||
@@ -674,54 +674,26 @@ func (cdrS *CDRServer) V1ProcessCDR(cdr *CDRWithArgDispatcher, reply *string) (e
|
||||
if cdr.Subject == utils.EmptyString { // Use account information as rating subject if missing
|
||||
cdr.Subject = cdr.Account
|
||||
}
|
||||
if !cdr.PreRated { // Enforce the RunID if CDR is not rated
|
||||
cdr.RunID = utils.MetaRaw
|
||||
}
|
||||
if utils.SliceHasMember([]string{"", utils.MetaRaw}, cdr.RunID) {
|
||||
cdr.Cost = -1.0
|
||||
if cdr.RunID == utils.EmptyString {
|
||||
cdr.RunID = utils.MetaDefault
|
||||
}
|
||||
cgrEv := &utils.CGREventWithArgDispatcher{
|
||||
CGREvent: &utils.CGREvent{
|
||||
Tenant: cdr.Tenant,
|
||||
ID: utils.UUIDSha1Prefix(),
|
||||
Event: cdr.AsMapStringIface(),
|
||||
},
|
||||
CGREvent: cdr.AsCGREvent(),
|
||||
ArgDispatcher: cdr.ArgDispatcher,
|
||||
}
|
||||
|
||||
if len(cdrS.cgrCfg.CdrsCfg().AttributeSConns) != 0 {
|
||||
if err = cdrS.attrSProcessEvent(cgrEv); err != nil {
|
||||
err = utils.NewErrServerError(err)
|
||||
return
|
||||
}
|
||||
}
|
||||
if cdrS.cgrCfg.CdrsCfg().StoreCdrs { // Store *raw CDR
|
||||
if err = cdrS.cdrDb.SetCDR(cdr.CDR, false); err != nil {
|
||||
utils.Logger.Warning(
|
||||
fmt.Sprintf("<%s> storing primary CDR %+v, got error: %s",
|
||||
utils.CDRs, cdr, err.Error()))
|
||||
err = utils.NewErrServerError(err) // Cannot store CDR
|
||||
return
|
||||
}
|
||||
}
|
||||
if len(cdrS.cgrCfg.CdrsCfg().OnlineCDRExports) != 0 {
|
||||
cdrS.exportCDRs([]*CDR{cdr.CDR}) // Replicate raw CDR
|
||||
}
|
||||
if len(cdrS.cgrCfg.CdrsCfg().ThresholdSConns) != 0 {
|
||||
go cdrS.thdSProcessEvent(cgrEv)
|
||||
}
|
||||
if len(cdrS.cgrCfg.CdrsCfg().StatSConns) != 0 {
|
||||
go cdrS.statSProcessEvent(cgrEv)
|
||||
}
|
||||
if len(cdrS.cgrCfg.CdrsCfg().ChargerSConns) != 0 &&
|
||||
utils.SliceHasMember([]string{"", utils.MetaRaw}, cdr.RunID) {
|
||||
go cdrS.chrgProcessEvent(cgrEv, len(cdrS.cgrCfg.CdrsCfg().AttributeSConns) != 0,
|
||||
cdrS.cgrCfg.CdrsCfg().StoreCdrs, false,
|
||||
len(cdrS.cgrCfg.CdrsCfg().OnlineCDRExports) != 0, len(cdrS.cgrCfg.CdrsCfg().ThresholdSConns) != 0,
|
||||
len(cdrS.cgrCfg.CdrsCfg().StatSConns) != 0)
|
||||
if err = cdrS.processEvent(cgrEv,
|
||||
len(cdrS.cgrCfg.CdrsCfg().ChargerSConns) != 0 && !cdr.PreRated,
|
||||
len(cdrS.cgrCfg.CdrsCfg().AttributeSConns) != 0,
|
||||
!cdr.PreRated, // rate the CDR if is not PreRated
|
||||
cdrS.cgrCfg.CdrsCfg().StoreCdrs,
|
||||
false, // no rerate
|
||||
len(cdrS.cgrCfg.CdrsCfg().OnlineCDRExports) != 0,
|
||||
len(cdrS.cgrCfg.CdrsCfg().ThresholdSConns) != 0,
|
||||
len(cdrS.cgrCfg.CdrsCfg().StatSConns) != 0); err != nil {
|
||||
return
|
||||
}
|
||||
*reply = utils.OK
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@@ -800,10 +772,8 @@ func (cdrS *CDRServer) V1ProcessEvent(arg *ArgV1ProcessEvent, reply *string) (er
|
||||
// end of processing options
|
||||
|
||||
cgrEv := &utils.CGREventWithArgDispatcher{
|
||||
CGREvent: &arg.CGREvent,
|
||||
}
|
||||
if arg.ArgDispatcher != nil {
|
||||
cgrEv.ArgDispatcher = arg.ArgDispatcher
|
||||
CGREvent: &arg.CGREvent,
|
||||
ArgDispatcher: arg.ArgDispatcher,
|
||||
}
|
||||
if err = cdrS.processEvent(cgrEv,
|
||||
chrgS, attrS, ralS, store, reRate, export, thdS, stS); err != nil {
|
||||
@@ -947,23 +917,27 @@ func (cdrS *CDRServer) V1RateCDRs(arg *ArgRateCDRs, reply *string) (err error) {
|
||||
if flgs.HasKey(utils.MetaStatS) {
|
||||
statS = flgs.GetBool(utils.MetaStatS)
|
||||
}
|
||||
if flgs.GetBool(utils.MetaChargers) {
|
||||
if len(cdrS.cgrCfg.CdrsCfg().ChargerSConns) == 0 {
|
||||
return utils.NewErrNotConnected(utils.ChargerS)
|
||||
chrgS := len(cdrS.cgrCfg.CdrsCfg().ChargerSConns) != 0
|
||||
if flgs.HasKey(utils.MetaChargers) {
|
||||
chrgS = flgs.GetBool(utils.MetaChargers)
|
||||
}
|
||||
|
||||
if chrgS && len(cdrS.cgrCfg.CdrsCfg().ChargerSConns) == 0 {
|
||||
return utils.NewErrNotConnected(utils.ChargerS)
|
||||
}
|
||||
for _, cdr := range cdrs {
|
||||
cdr.Cost = -1 // the cost will be recalculated
|
||||
cgrEv := &utils.CGREventWithArgDispatcher{
|
||||
CGREvent: cdr.AsCGREvent(),
|
||||
ArgDispatcher: arg.ArgDispatcher,
|
||||
}
|
||||
for _, cdr := range cdrs {
|
||||
argCharger := &utils.CGREventWithArgDispatcher{
|
||||
CGREvent: cdr.AsCGREvent(),
|
||||
ArgDispatcher: arg.ArgDispatcher,
|
||||
}
|
||||
if err = cdrS.chrgProcessEvent(argCharger,
|
||||
false, store, true, export, thdS, statS); err != nil {
|
||||
return utils.NewErrServerError(err)
|
||||
}
|
||||
if err = cdrS.processEvent(cgrEv,
|
||||
chrgS, false, true, store, true, export, thdS, statS); err != nil {
|
||||
return utils.NewErrServerError(err)
|
||||
}
|
||||
}
|
||||
*reply = utils.OK
|
||||
return nil
|
||||
return
|
||||
}
|
||||
|
||||
// V1ProcessExternalCDR is used to process external CDRs
|
||||
|
||||
@@ -184,7 +184,7 @@ func testV1CDRsProcessEventAttrS(t *testing.T) {
|
||||
var replyAt *engine.AttributeProfile
|
||||
if err := pecdrsRpc.Call(utils.ApierV1GetAttributeProfile,
|
||||
&utils.TenantID{Tenant: "cgrates.org", ID: "ApierTest"}, &replyAt); err != nil {
|
||||
t.Error(err)
|
||||
t.Fatal(err)
|
||||
}
|
||||
replyAt.Compile()
|
||||
if !reflect.DeepEqual(alsPrf, replyAt) {
|
||||
|
||||
@@ -302,8 +302,6 @@ const (
|
||||
MetaSQSjsonMap = "*sqs_json_map"
|
||||
MetaKafkajsonMap = "*kafka_json_map"
|
||||
MetaSQL = "*sql"
|
||||
MetaMySQL = "*mysql"
|
||||
MetaPostgres = "*postgres"
|
||||
MetaS3jsonMap = "*s3_json_map"
|
||||
CONFIG_PATH = "/etc/cgrates/"
|
||||
DISCONNECT_CAUSE = "DisconnectCause"
|
||||
|
||||
Reference in New Issue
Block a user