unit counters revision

This commit is contained in:
Radu Ioan Fericean
2015-10-30 11:26:49 +02:00
parent 7b89af8b6a
commit 1e1c115ed4
4 changed files with 72 additions and 59 deletions

View File

@@ -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,
}
}
}

View File

@@ -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

View File

@@ -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,

View File

@@ -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() {