diff --git a/engine/storage_sql.go b/engine/storage_sql.go index a42d183b2..44e1c00b8 100644 --- a/engine/storage_sql.go +++ b/engine/storage_sql.go @@ -582,7 +582,7 @@ func (self *SQLStorage) SetCdr(cdr *utils.StoredCdr) (err error) { } func (self *SQLStorage) SetRatedCdr(storedCdr *utils.StoredCdr, extraInfo string) (err error) { - _, err = self.Db.Exec(fmt.Sprintf("INSERT INTO %s (cgrid,runid,subject,cost,mediation_time,extra_info) VALUES ('%s','%s','%s',%f,now(),'%s') ON DUPLICATE KEY UPDATE subject=values(subject),cost=values(cost),extra_info=values(extra_info)", + _, err = self.Db.Exec(fmt.Sprintf("INSERT INTO %s (cgrid,runid,subject,cost,mediation_time,extra_info) VALUES ('%s','%s','%s',%f,now(),'%s') ON DUPLICATE KEY UPDATE subject=values(subject),cost=values(cost),mediation_time=now(),extra_info=values(extra_info)", utils.TBL_RATED_CDRS, storedCdr.CgrId, storedCdr.MediationRunId, diff --git a/mediator/mediator.go b/mediator/mediator.go index d01b7a313..53773cc93 100644 --- a/mediator/mediator.go +++ b/mediator/mediator.go @@ -109,7 +109,8 @@ func (self *Mediator) rateCDR(storedCdr *utils.StoredCdr) error { } func (self *Mediator) RateCdr(storedCdr *utils.StoredCdr) error { - cdrs := []*utils.StoredCdr{storedCdr} // Start with initial storCdr, will add here all to be mediated + storedCdr.MediationRunId = utils.DEFAULT_RUNID + cdrRuns := []*utils.StoredCdr{storedCdr} // Start with initial storCdr, will add here all to be mediated attrsDC := utils.AttrDerivedChargers{Tenant: storedCdr.Tenant, Category: storedCdr.Category, Direction: storedCdr.Direction, Account: storedCdr.Account, Subject: storedCdr.Subject} var dcs utils.DerivedChargers @@ -119,19 +120,26 @@ func (self *Mediator) RateCdr(storedCdr *utils.StoredCdr) error { return errors.New(errText) } for _, dc := range dcs { - forkedCdr, err := storedCdr.ForkCdr(dc.RunId, &utils.RSRField{Id: dc.ReqTypeField}, &utils.RSRField{Id: dc.DirectionField}, - &utils.RSRField{Id: dc.TenantField}, &utils.RSRField{Id: dc.CategoryField}, &utils.RSRField{Id: dc.AccountField}, - &utils.RSRField{Id: dc.SubjectField}, &utils.RSRField{Id: dc.DestinationField}, &utils.RSRField{Id: dc.SetupTimeField}, - &utils.RSRField{Id: dc.AnswerTimeField}, &utils.RSRField{Id: dc.DurationField}, []*utils.RSRField{}, true) - engine.Logger.Debug(fmt.Sprintf("Forked CDR for dc: %v, is: %v", dc, forkedCdr)) + dcReqTypeFld, _ := utils.NewRSRField(dc.ReqTypeField) + dcDirFld, _ := utils.NewRSRField(dc.DirectionField) + dcTenantFld, _ := utils.NewRSRField(dc.TenantField) + dcCategoryFld, _ := utils.NewRSRField(dc.CategoryField) + dcAcntFld, _ := utils.NewRSRField(dc.AccountField) + dcSubjFld, _ := utils.NewRSRField(dc.SubjectField) + dcDstFld, _ := utils.NewRSRField(dc.DestinationField) + dcSTimeFld, _ := utils.NewRSRField(dc.SetupTimeField) + dcATimeFld, _ := utils.NewRSRField(dc.AnswerTimeField) + dcDurFld, _ := utils.NewRSRField(dc.DurationField) + forkedCdr, err := storedCdr.ForkCdr(dc.RunId, dcReqTypeFld, dcDirFld, dcTenantFld, dcCategoryFld, dcAcntFld, dcSubjFld, dcDstFld, dcSTimeFld, dcATimeFld, dcDurFld, + []*utils.RSRField{}, true) if err != nil { // Errors on fork, cannot calculate further, write that into db for later analysis self.cdrDb.SetRatedCdr(&utils.StoredCdr{CgrId: storedCdr.CgrId, CdrSource: utils.FORKED_CDR, MediationRunId: dc.RunId, Cost: -1}, err.Error()) // Cannot fork CDR, important just runid and error continue } - cdrs = append(cdrs, forkedCdr) + cdrRuns = append(cdrRuns, forkedCdr) } - for _, cdr := range cdrs { + for _, cdr := range cdrRuns { extraInfo := "" if err := self.rateCDR(cdr); err != nil { extraInfo = err.Error() diff --git a/mediator/mediator_local_test.go b/mediator/mediator_local_test.go index 36a6a74f0..b1e0287ec 100644 --- a/mediator/mediator_local_test.go +++ b/mediator/mediator_local_test.go @@ -224,7 +224,7 @@ func TestRateCdrs(t *testing.T) { } if errRatedCdrs, err := cdrStor.GetStoredCdrs(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0, 0, time.Time{}, time.Time{}, false, true); err != nil { t.Error(err) - } else if len(errRatedCdrs) != 6 { // The first 2 with errors should be still there before rerating + } else if len(errRatedCdrs) != 4 { // The first 2 with errors should be still there before rerating t.Error(fmt.Sprintf("Unexpected number of CDRs with errors: %d", len(errRatedCdrs))) } if err := cgrRpc.Call("MediatorV1.RateCdrs", utils.AttrRateCdrs{RerateErrors: true}, &reply); err != nil {