mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
unit counters revision
This commit is contained in:
@@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user