From bf1b302dd3bf2fb8f3cf50d1185cf5c4af9682dc Mon Sep 17 00:00:00 2001 From: DanB Date: Wed, 17 May 2017 20:58:58 +0200 Subject: [PATCH] EventCost Balances -> Accounting, RatingUnits -> Rating --- engine/eventcost.go | 46 ++++++++++++++++++++++----------------------- utils/coreutils.go | 4 ++++ 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/engine/eventcost.go b/engine/eventcost.go index 685a1cc2a..34ac7c3aa 100644 --- a/engine/eventcost.go +++ b/engine/eventcost.go @@ -39,10 +39,10 @@ func (rfs RatingFilters) GetUUIDWithSet(rmf *RatingMatchedFilters) string { return uuid } -type ChargedRatingUnits map[string]*RatingUnit +type Rating map[string]*RatingUnit // GetUUIDWithSet attempts to retrieve the UUID of a matching data or create a new one -func (crus ChargedRatingUnits) GetUUIDWithSet(cru *RatingUnit) string { +func (crus Rating) GetUUIDWithSet(cru *RatingUnit) string { for k, v := range crus { if v.Equals(cru) { return k @@ -84,10 +84,10 @@ func (cts ChargedTimings) GetUUIDWithSet(ct *ChargedTiming) string { return uuid } -type ChargedBalances map[string]*BalanceCharge +type Accounting map[string]*BalanceCharge // GetUUIDWithSet attempts to retrieve the UUID of a matching data or create a new one -func (cbs ChargedBalances) GetUUIDWithSet(cb *BalanceCharge) string { +func (cbs Accounting) GetUUIDWithSet(cb *BalanceCharge) string { for k, v := range cbs { if v.Equals(cb) { return k @@ -102,10 +102,10 @@ func (cbs ChargedBalances) GetUUIDWithSet(cb *BalanceCharge) string { func NewEventCostFromCallCost(cc *CallCost, cgrID, runID string) (ec *EventCost) { ec = &EventCost{CGRID: cgrID, RunID: runID, RatingFilters: make(RatingFilters), - RatingUnits: make(ChargedRatingUnits), + Rating: make(Rating), Rates: make(ChargedRates), Timings: make(ChargedTimings), - Balances: make(ChargedBalances), + Accounting: make(Accounting), } if len(cc.Timespans) != 0 { ec.Charges = make([]*ChargingInterval, len(cc.Timespans)) @@ -131,7 +131,7 @@ func NewEventCostFromCallCost(cc *CallCost, cgrID, runID string) (ec *EventCost) // 2 balances work-around ecUUID := utils.META_NONE // populate no matter what due to Unit not nil if incr.BalanceInfo.Monetary != nil { - if uuid := ec.Balances.GetUUIDWithSet( + if uuid := ec.Accounting.GetUUIDWithSet( &BalanceCharge{ AccountID: incr.BalanceInfo.AccountID, BalanceUUID: incr.BalanceInfo.Monetary.UUID, @@ -141,20 +141,20 @@ func NewEventCostFromCallCost(cc *CallCost, cgrID, runID string) (ec *EventCost) ecUUID = uuid } } - cIt.BalanceChargeUUID = ec.Balances.GetUUIDWithSet( + cIt.BalanceChargeUUID = ec.Accounting.GetUUIDWithSet( &BalanceCharge{ AccountID: incr.BalanceInfo.AccountID, BalanceUUID: incr.BalanceInfo.Unit.UUID, Units: incr.BalanceInfo.Unit.Consumed, RatingUUID: ec.ratingUUIDForRateInterval(incr.BalanceInfo.Unit.RateInterval, rf), ExtraChargeUUID: ecUUID}) - } else { // Only monetary - cIt.BalanceChargeUUID = ec.Balances.GetUUIDWithSet( + } else if incr.BalanceInfo.Monetary != nil { // Only monetary + cIt.BalanceChargeUUID = ec.Accounting.GetUUIDWithSet( &BalanceCharge{ AccountID: incr.BalanceInfo.AccountID, BalanceUUID: incr.BalanceInfo.Monetary.UUID, Units: incr.Cost, - RatingUUID: ec.ratingUUIDForRateInterval(incr.BalanceInfo.Unit.RateInterval, rf)}) + RatingUUID: ec.ratingUUIDForRateInterval(incr.BalanceInfo.Monetary.RateInterval, rf)}) } cIl.Increments[j] = cIt } @@ -167,15 +167,14 @@ func NewEventCostFromCallCost(cc *CallCost, cgrID, runID string) (ec *EventCost) type EventCost struct { CGRID string RunID string - Cost float64 - Usage time.Duration + Cost *float64 // pointer so we can nil it when dirty + Usage *time.Duration Charges []*ChargingInterval + Rating Rating + Accounting Accounting RatingFilters RatingFilters - RatingUnits ChargedRatingUnits Rates ChargedRates Timings ChargedTimings - Balances ChargedBalances - dirty bool // mark need of recomputation of the Cost and Usage } func (ec *EventCost) ratingUUIDForRateInterval(ri *RateInterval, rf *RatingMatchedFilters) string { @@ -189,7 +188,8 @@ func (ec *EventCost) ratingUUIDForRateInterval(ri *RateInterval, rf *RatingMatch var tmID string if ri.Timing != nil { tmID = ec.Timings.GetUUIDWithSet( - &ChargedTiming{Years: ri.Timing.Years, + &ChargedTiming{ + Years: ri.Timing.Years, Months: ri.Timing.Months, MonthDays: ri.Timing.MonthDays, WeekDays: ri.Timing.WeekDays, @@ -199,7 +199,7 @@ func (ec *EventCost) ratingUUIDForRateInterval(ri *RateInterval, rf *RatingMatch if len(ri.Rating.Rates) != 0 { rtUUID = ec.Rates.GetUUIDWithSet(ri.Rating.Rates) } - return ec.RatingUnits.GetUUIDWithSet( + return ec.Rating.GetUUIDWithSet( &RatingUnit{ ConnectFee: ri.Rating.ConnectFee, RoundingMethod: ri.Rating.RoundingMethod, @@ -215,7 +215,7 @@ func (ec *EventCost) rateIntervalForRatingUUID(ratingUUID string) (ri *RateInter if ratingUUID == "" { return } - cIlRU := ec.RatingUnits[ratingUUID] + cIlRU := ec.Rating[ratingUUID] ri = new(RateInterval) ri.Rating = &RIRate{ConnectFee: cIlRU.ConnectFee, RoundingMethod: cIlRU.RoundingMethod, @@ -240,8 +240,8 @@ func (ec *EventCost) AsCallCost(ToR, Tenant, Direction, Category, Account, Subje ts := &TimeSpan{TimeStart: cIl.StartTime, TimeEnd: cIl.StartTime.Add(cIl.Usage()), Cost: cIl.Cost(), DurationIndex: cIl.Usage(), CompressFactor: cIl.CompressFactor} if cIl.RatingUUID != "" { - if ec.RatingUnits[cIl.RatingUUID].RatingFiltersUUID != "" { - rfs := ec.RatingFilters[ec.RatingUnits[cIl.RatingUUID].RatingFiltersUUID] + if ec.Rating[cIl.RatingUUID].RatingFiltersUUID != "" { + rfs := ec.RatingFilters[ec.Rating[cIl.RatingUUID].RatingFiltersUUID] ts.MatchedSubject = rfs.Subject ts.MatchedPrefix = rfs.DestinationPrefix ts.MatchedDestId = rfs.DestinationID @@ -255,14 +255,14 @@ func (ec *EventCost) AsCallCost(ToR, Tenant, Direction, Category, Account, Subje for j, cInc := range cIl.Increments { incr := &Increment{Duration: cInc.Usage, Cost: cInc.Cost, CompressFactor: cInc.CompressFactor} if cInc.BalanceChargeUUID != "" { - cBC := ec.Balances[cInc.BalanceChargeUUID] + cBC := ec.Accounting[cInc.BalanceChargeUUID] incr.BalanceInfo = &DebitInfo{AccountID: cBC.AccountID} if cBC.ExtraChargeUUID != "" { // have both monetary and data // Work around, enforce logic with 2 balances for *voice/*monetary combination // so we can stay compatible with CallCost incr.BalanceInfo.Unit = &UnitInfo{UUID: cBC.BalanceUUID, Consumed: cBC.Units} incr.BalanceInfo.Unit.RateInterval = ec.rateIntervalForRatingUUID(cBC.RatingUUID) - cBC = ec.Balances[cBC.ExtraChargeUUID] // overwrite original balance so we can process it in one place + cBC = ec.Accounting[cBC.ExtraChargeUUID] // overwrite original balance so we can process it in one place } incr.BalanceInfo.Monetary = &MonetaryInfo{UUID: cBC.BalanceUUID} incr.BalanceInfo.Monetary.RateInterval = ec.rateIntervalForRatingUUID(cBC.RatingUUID) diff --git a/utils/coreutils.go b/utils/coreutils.go index 2b247315a..b4d2f24b2 100644 --- a/utils/coreutils.go +++ b/utils/coreutils.go @@ -429,6 +429,10 @@ func TimePointer(t time.Time) *time.Time { return &t } +func DurationPointer(d time.Duration) *time.Duration { + return &d +} + func ReflectFuncLocation(handler interface{}) (file string, line int) { f := runtime.FuncForPC(reflect.ValueOf(handler).Pointer()) entry := f.Entry()