diff --git a/agents/dmtagent_it_test.go b/agents/dmtagent_it_test.go index 8ec97b1ba..12d467125 100644 --- a/agents/dmtagent_it_test.go +++ b/agents/dmtagent_it_test.go @@ -623,7 +623,7 @@ func TestDmtAgentCdrs(t *testing.T) { if cdrs[0].Usage != "610" { t.Errorf("Unexpected CDR Usage received, cdr: %+v ", cdrs[0]) } - if cdrs[0].Cost != 0.795 { + if cdrs[0].Cost != 0.7565 { t.Errorf("Unexpected CDR Cost received, cdr: %+v ", cdrs[0]) } } diff --git a/apier/v1/smgenericv1_it_test.go b/apier/v1/smgenericv1_it_test.go index 56c019d3e..6afd87eb4 100644 --- a/apier/v1/smgenericv1_it_test.go +++ b/apier/v1/smgenericv1_it_test.go @@ -151,7 +151,7 @@ func TestSMGV1GetMaxUsage(t *testing.T) { var maxTime float64 if err := smgV1Rpc.Call("SMGenericV1.GetMaxUsage", setupReq, &maxTime); err != nil { t.Error(err) - } else if maxTime != 2690 { + } else if maxTime != 2700 { t.Errorf("Calling ApierV2.MaxUsage got maxTime: %f", maxTime) } } diff --git a/engine/callcost.go b/engine/callcost.go index 502bd0754..fcfd59006 100644 --- a/engine/callcost.go +++ b/engine/callcost.go @@ -201,20 +201,23 @@ func (cc *CallCost) Round() { ts.RateInterval.Rating.RoundingMethod) correctionCost := roundedCost - cost //log.Print(cost, roundedCost, correctionCost) - roundInc := &Increment{ - Cost: correctionCost, - BalanceInfo: inc.BalanceInfo, + if correctionCost != 0 { + ts.RoundIncrement = &Increment{ + Cost: correctionCost, + BalanceInfo: inc.BalanceInfo, + } + totalCorrectionCost += correctionCost + ts.Cost += correctionCost } - totalCorrectionCost += correctionCost - ts.Cost += correctionCost - ts.RoundIncrements = append(ts.RoundIncrements, roundInc) } cc.Cost += totalCorrectionCost } func (cc *CallCost) GetRoundIncrements() (roundIncrements Increments) { for _, ts := range cc.Timespans { - roundIncrements = append(roundIncrements, ts.RoundIncrements...) + if ts.RoundIncrement != nil && ts.RoundIncrement.Cost != 0 { + roundIncrements = append(roundIncrements, ts.RoundIncrement) + } } return } diff --git a/engine/calldesc.go b/engine/calldesc.go index c70f8b4eb..ce2bd49e0 100644 --- a/engine/calldesc.go +++ b/engine/calldesc.go @@ -682,9 +682,12 @@ func (cd *CallDescriptor) debit(account *Account, dryRun bool, goNegative bool) } if cd.PerformRounding { cc.Round() - rcd := cc.CreateCallDescriptor() - rcd.Increments = cc.GetRoundIncrements() - rcd.RefundRounding() + roundIncrements := cc.GetRoundIncrements() + if len(roundIncrements) != 0 { + rcd := cc.CreateCallDescriptor() + rcd.Increments = roundIncrements + rcd.RefundRounding() + } } //log.Printf("OUT CC: ", cc) return diff --git a/engine/timespans.go b/engine/timespans.go index dea4af215..34aec558b 100644 --- a/engine/timespans.go +++ b/engine/timespans.go @@ -36,7 +36,7 @@ type TimeSpan struct { RateInterval *RateInterval DurationIndex time.Duration // the call duration so far till TimeEnd Increments Increments - RoundIncrements Increments + RoundIncrement *Increment MatchedSubject, MatchedPrefix, MatchedDestId, RatingPlanId string CompressFactor int ratingInfo *RatingInfo diff --git a/sessionmanager/session.go b/sessionmanager/session.go index 0be6f663c..31942cfdf 100644 --- a/sessionmanager/session.go +++ b/sessionmanager/session.go @@ -230,11 +230,14 @@ func (s *Session) SaveOperations() { firstCC.Timespans.Compress() firstCC.Round() - cd := firstCC.CreateCallDescriptor() - cd.Increments = firstCC.GetRoundIncrements() - var response float64 - if err := s.sessionManager.Rater().RefundRounding(cd, &response); err != nil { - utils.Logger.Err(fmt.Sprintf(" ERROR failed to refund rounding: %v", err)) + roundIncrements := firstCC.GetRoundIncrements() + if len(roundIncrements) != 0 { + cd := firstCC.CreateCallDescriptor() + cd.Increments = roundIncrements + var response float64 + if err := s.sessionManager.Rater().RefundRounding(cd, &response); err != nil { + utils.Logger.Err(fmt.Sprintf(" ERROR failed to refund rounding: %v", err)) + } } var reply string err := s.sessionManager.CdrSrv().LogCallCost(&engine.CallCostLog{ diff --git a/sessionmanager/smg_session.go b/sessionmanager/smg_session.go index 019cc5cbc..7d6238ec5 100644 --- a/sessionmanager/smg_session.go +++ b/sessionmanager/smg_session.go @@ -205,11 +205,14 @@ func (self *SMGSession) saveOperations() error { } firstCC.Timespans.Compress() firstCC.Round() - cd := firstCC.CreateCallDescriptor() - cd.Increments = firstCC.GetRoundIncrements() - var response float64 - if err := self.rater.RefundRounding(cd, &response); err != nil { - return err + roundIncrements := firstCC.GetRoundIncrements() + if len(roundIncrements) != 0 { + cd := firstCC.CreateCallDescriptor() + cd.Increments = roundIncrements + var response float64 + if err := self.rater.RefundRounding(cd, &response); err != nil { + return err + } } var reply string diff --git a/sessionmanager/smgeneric.go b/sessionmanager/smgeneric.go index 62736581c..f9e4e27a7 100644 --- a/sessionmanager/smgeneric.go +++ b/sessionmanager/smgeneric.go @@ -278,11 +278,14 @@ func (self *SMGeneric) ChargeEvent(gev SMGenericEvent, clnt *rpc2.Client) (maxDu } } cc.Round() - cd := cc.CreateCallDescriptor() - cd.Increments = cc.GetRoundIncrements() - var response float64 - if err := self.rater.RefundRounding(cd, &response); err != nil { - utils.Logger.Err(fmt.Sprintf(" ERROR failed to refund rounding: %v", err)) + roundIncrements := cc.GetRoundIncrements() + if len(roundIncrements) != 0 { + cd := cc.CreateCallDescriptor() + cd.Increments = roundIncrements + var response float64 + if err := self.rater.RefundRounding(cd, &response); err != nil { + utils.Logger.Err(fmt.Sprintf(" ERROR failed to refund rounding: %v", err)) + } } var reply string