diff --git a/engine/account.go b/engine/account.go index c5ec13f00..73b4dbbed 100644 --- a/engine/account.go +++ b/engine/account.go @@ -390,7 +390,7 @@ func (ub *Account) debitCreditBalance(cd *CallDescriptor, count bool, dryRun boo increment.BalanceInfo.AccountId = ub.Id increment.paid = true if count { - ub.countUnits(&Action{BalanceType: utils.MONETARY, Balance: &Balance{Directions: utils.StringMap{leftCC.Direction: true}, Value: cost, DestinationIds: utils.StringMap{leftCC.Destination: true}}}) + ub.countUnits(&Action{BalanceType: utils.MONETARY, Balance: &Balance{Directions: utils.StringMap{leftCC.Direction: true}, Value: cost, DestinationIds: utils.NewStringMap(leftCC.Destination)}}) } } } @@ -550,9 +550,10 @@ func (ub *Account) countUnits(a *Action) { } // Create counters for all triggered actions that have actions opertating on balances -func (ub *Account) initCounters() { +func (acc *Account) initCounters() { ucTempMap := make(map[string]*UnitsCounter) - for _, at := range ub.ActionTriggers { + // add default balance + for _, at := range acc.ActionTriggers { acs, err := ratingStorage.GetActions(at.ActionsId, false) if err != nil { continue @@ -564,12 +565,14 @@ func (ub *Account) initCounters() { uc = &UnitsCounter{BalanceType: a.BalanceType} ucTempMap[a.BalanceType] = uc uc.Balances = BalanceChain{} - ub.UnitCounters = append(ub.UnitCounters, uc) + acc.UnitCounters = append(acc.UnitCounters, uc) } b := a.Balance.Clone() b.SetValue(0) - uc.Balances = append(uc.Balances, b) - uc.Balances.Sort() + if !uc.Balances.HasBalance(b) { + uc.Balances = append(uc.Balances, b) + } + //uc.Balances.Sort() // do not sort } } } @@ -775,48 +778,48 @@ func (acc *Account) AsOldStructure() interface{} { } } } - for i,at:=range acc.ActionTriggers{ - result.ActionTriggers[i]= &ActionTrigger{ - Id :at.Id, - ThresholdType :at.ThresholdType, - ThresholdValue :at.ThresholdValue, - Recurrent :at.Recurrent, - MinSleep :at.MinSleep, - BalanceId :at.BalanceId, - BalanceType :at.BalanceType, - BalanceDirection :at.BalanceDirections.String(), - BalanceDestinationIds :at.BalanceDestinationIds.String(), - BalanceWeight :at.BalanceWeight, - BalanceExpirationDate :at.BalanceExpirationDate, - BalanceTimingTags :at.BalanceTimingTags.String(), - BalanceRatingSubject :at.BalanceRatingSubject, - BalanceCategory :at.BalanceCategories.String(), - BalanceSharedGroup :at.BalanceSharedGroups.String(), - BalanceDisabled :at.BalanceDisabled, - Weight :at.Weight, - ActionsId :at.ActionsId, - MinQueuedItems :at.MinQueuedItems, - Executed :at.Executed, + for i, at := range acc.ActionTriggers { + result.ActionTriggers[i] = &ActionTrigger{ + Id: at.Id, + ThresholdType: at.ThresholdType, + ThresholdValue: at.ThresholdValue, + Recurrent: at.Recurrent, + MinSleep: at.MinSleep, + BalanceId: at.BalanceId, + BalanceType: at.BalanceType, + BalanceDirection: at.BalanceDirections.String(), + BalanceDestinationIds: at.BalanceDestinationIds.String(), + BalanceWeight: at.BalanceWeight, + BalanceExpirationDate: at.BalanceExpirationDate, + BalanceTimingTags: at.BalanceTimingTags.String(), + BalanceRatingSubject: at.BalanceRatingSubject, + BalanceCategory: at.BalanceCategories.String(), + BalanceSharedGroup: at.BalanceSharedGroups.String(), + BalanceDisabled: at.BalanceDisabled, + Weight: at.Weight, + ActionsId: at.ActionsId, + MinQueuedItems: at.MinQueuedItems, + Executed: at.Executed, } } - for key, values:=range acc.BalanceMap{ - if len(values)>0{ + for key, values := range acc.BalanceMap { + if len(values) > 0 { key += values[0].Directions.String() - result.BalanceMap[key]= make(BalanceChain, len(values)) - for i, b:= range values{ - result.BalanceMap[key][i]=&Balance{ - Uuid :b.Uuid, - Id:b.Id, - Value :b.Value, - ExpirationDate :b.ExpirationDate, - Weight :b.Weight, - DestinationIds :b.DestinationIds.String(), - RatingSubject :b.RatingSubject, - Category :b.Categories.String(), - SharedGroup :b.SharedGroups.String(), - Timings:b.Timings, - TimingIDs :b.TimingIDs.String(), - Disabled :b.Disabled, + result.BalanceMap[key] = make(BalanceChain, len(values)) + for i, b := range values { + result.BalanceMap[key][i] = &Balance{ + Uuid: b.Uuid, + Id: b.Id, + Value: b.Value, + ExpirationDate: b.ExpirationDate, + Weight: b.Weight, + DestinationIds: b.DestinationIds.String(), + RatingSubject: b.RatingSubject, + Category: b.Categories.String(), + SharedGroup: b.SharedGroups.String(), + Timings: b.Timings, + TimingIDs: b.TimingIDs.String(), + Disabled: b.Disabled, } } } diff --git a/engine/action_trigger.go b/engine/action_trigger.go index 615ddc2f8..57177b2cc 100644 --- a/engine/action_trigger.go +++ b/engine/action_trigger.go @@ -41,7 +41,7 @@ type ActionTrigger struct { BalanceDestinationIds utils.StringMap // filter for balance BalanceWeight float64 // filter for balance BalanceExpirationDate time.Time // filter for balance - BalanceTimingTags utils.StringMap // filter for balance + BalanceTimingTags utils.StringMap // filter for balance BalanceRatingSubject string // filter for balance BalanceCategories utils.StringMap // filter for balance BalanceSharedGroups utils.StringMap // filter for balance @@ -110,7 +110,7 @@ func (at *ActionTrigger) Match(a *Action) bool { return match } id := a.BalanceType == "" || at.BalanceType == a.BalanceType - thresholdType, thresholdValue, direction, destinationId, weight, ratingSubject, categories, sharedGroup,timings, disabled := true, true, true, true, true, true, true, true, true, true + thresholdType, thresholdValue, direction, destinationId, weight, ratingSubject, categories, sharedGroup, timings, disabled := true, true, true, true, true, true, true, true, true, true if a.ExtraParameters != "" { t := struct { ThresholdType string @@ -120,8 +120,8 @@ func (at *ActionTrigger) Match(a *Action) bool { BalanceWeight float64 BalanceRatingSubject string BalanceCategories string - BalanceSharedGroups string - BalanceTimingTags string + BalanceSharedGroups string + BalanceTimingTags string BalanceDisabled bool }{} json.Unmarshal([]byte(a.ExtraParameters), &t) @@ -131,7 +131,7 @@ func (at *ActionTrigger) Match(a *Action) bool { destinationId = len(t.DestinationIds) == 0 || at.BalanceDestinationIds.Equal(utils.ParseStringMap(t.DestinationIds)) categories = len(t.BalanceCategories) == 0 || at.BalanceCategories.Equal(utils.ParseStringMap(t.BalanceCategories)) timings = len(t.BalanceTimingTags) == 0 || at.BalanceTimingTags.Equal(utils.ParseStringMap(t.BalanceTimingTags)) - sharedGroup = len(t.BalanceSharedGroups) == 0 || at.BalanceSharedGroups.Equal( utils.ParseStringMap(t.BalanceSharedGroups)) + sharedGroup = len(t.BalanceSharedGroups) == 0 || at.BalanceSharedGroups.Equal(utils.ParseStringMap(t.BalanceSharedGroups)) weight = t.BalanceWeight == 0 || at.BalanceWeight == t.BalanceWeight ratingSubject = t.BalanceRatingSubject == "" || at.BalanceRatingSubject == t.BalanceRatingSubject disabled = at.BalanceDisabled == t.BalanceDisabled @@ -146,6 +146,20 @@ func (at *ActionTrigger) Clone() *ActionTrigger { return clone } +func (at *ActionTrigger) CreateBalance() *Balance { + return &Balance{ + Directions: at.BalanceDirections, + ExpirationDate: at.BalanceExpirationDate, + Weight: at.BalanceWeight, + DestinationIds: at.BalanceDestinationIds, + RatingSubject: at.BalanceRatingSubject, + Categories: at.BalanceCategories, + SharedGroups: at.BalanceSharedGroups, + TimingIDs: at.BalanceTimingTags, + Disabled: at.BalanceDisabled, + } +} + // Structure to store actions according to weight type ActionTriggers []*ActionTrigger diff --git a/engine/balances.go b/engine/balances.go index 55378fa78..7f7c49a14 100644 --- a/engine/balances.go +++ b/engine/balances.go @@ -41,7 +41,7 @@ type Balance struct { DestinationIds utils.StringMap RatingSubject string Categories utils.StringMap - SharedGroups utils.StringMap + SharedGroups utils.StringMap Timings []*RITiming TimingIDs utils.StringMap Disabled bool @@ -191,7 +191,7 @@ func (b *Balance) Clone() *Balance { Weight: b.Weight, RatingSubject: b.RatingSubject, Categories: b.Categories, - SharedGroups: b.SharedGroups, + SharedGroups: b.SharedGroups, TimingIDs: b.TimingIDs, Timings: b.Timings, // should not be a problem with aliasing Disabled: b.Disabled, @@ -664,7 +664,7 @@ func (bc BalanceChain) SaveDirtyBalances(acc *Account) { "Directions": b.Directions.String(), "RatingSubject": b.RatingSubject, "Categories": b.Categories.String(), - "SharedGroups": b.SharedGroups.String(), + "SharedGroups": b.SharedGroups.String(), "TimingIDs": b.TimingIDs.String(), "Account": accountId, "AccountAllowNegative": allowNegative, diff --git a/engine/units_counter.go b/engine/units_counter.go index 39c5f5c74..1bf97eed0 100644 --- a/engine/units_counter.go +++ b/engine/units_counter.go @@ -60,7 +60,7 @@ func (uc *UnitsCounter) initBalances(ats []*ActionTrigger) { // returns the first balance that has no destination attached func (uc *UnitsCounter) GetGeneralBalance() *Balance { - if len(uc.Balances) == 0 { // general balance not present for some reson + if len(uc.Balances) == 0 { // general balance not present for some reason uc.Balances = append(uc.Balances, &Balance{}) } return uc.Balances[0] @@ -70,11 +70,7 @@ func (uc *UnitsCounter) GetGeneralBalance() *Balance { // is the same or ads the balance to the list if none matches. func (uc *UnitsCounter) addUnits(amount float64, prefixMap utils.StringMap) { counted := false - prefix := "" - for key := range prefixMap { // get the first value - prefix = key - break - } + prefix := prefixMap.String() if prefix != "" { for _, mb := range uc.Balances { if !mb.HasDestination() {