From bd4aa99458eeccf98aa6b2269856d628f00991e7 Mon Sep 17 00:00:00 2001 From: ionutboangiu Date: Mon, 1 Apr 2024 18:05:56 +0300 Subject: [PATCH] Refactor balance's Factor field name with its plural form Stored balances previous to this commit, that had a non-nil Factors map, will now have Factors nil due to field name mismatch. --- apier/v1/apier_it_test.go | 2 +- cmd/cgr-console/cgr-console_it_test.go | 4 +-- docs/rals.rst | 2 +- engine/account.go | 8 ++--- engine/account_test.go | 4 +-- engine/action.go | 2 +- engine/actions_test.go | 8 ++--- engine/balance_filter.go | 36 ++++++++++----------- engine/balance_filter_test.go | 24 +++++++------- engine/balances.go | 44 +++++++++++++------------- engine/balances_test.go | 24 +++++++------- engine/eventcost_test.go | 20 ++++++------ migrator/accounts.go | 4 +-- migrator/accounts2_it_test.go | 6 ++-- migrator/accounts_it_test.go | 6 ++-- migrator/accounts_test.go | 6 ++-- utils/consts.go | 1 - 17 files changed, 100 insertions(+), 101 deletions(-) diff --git a/apier/v1/apier_it_test.go b/apier/v1/apier_it_test.go index db8c7a36a..ac6adeb87 100644 --- a/apier/v1/apier_it_test.go +++ b/apier/v1/apier_it_test.go @@ -2167,7 +2167,7 @@ func testApierRemoveRatingProfilesWithoutTenant(t *testing.T) { } func testApierReplayFldPosts(t *testing.T) { - bev := []byte(`{"ID":"cgrates.org:1007","BalanceMap":{"*monetary":[{"Uuid":"367be35a-96ee-40a5-b609-9130661f5f12","ID":"","Value":0,"ExpirationDate":"0001-01-01T00:00:00Z","Weight":10,"DestinationIDs":{},"RatingSubject":"","Categories":{},"SharedGroups":{"SHARED_A":true},"Timings":null,"TimingIDs":{},"Disabled":false,"Factor":null,"Blocker":false}]},"UnitCounters":{"*monetary":[{"CounterType":"*event","Counters":[{"Value":0,"Filter":{"Uuid":null,"ID":"b8531413-10d5-47ad-81ad-2bc272e8f0ca","Type":"*monetary","Value":null,"ExpirationDate":null,"Weight":null,"DestinationIDs":{"FS_USERS":true},"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factor":null,"Blocker":null}}]}]},"ActionTriggers":[{"ID":"STANDARD_TRIGGERS","UniqueID":"46ac7b8c-685d-4555-bf73-fa6cfbc2fa21","ThresholdType":"*min_balance","ThresholdValue":2,"Recurrent":false,"MinSleep":0,"ExpirationDate":"0001-01-01T00:00:00Z","ActivationDate":"0001-01-01T00:00:00Z","Balance":{"Uuid":null,"ID":null,"Type":"*monetary","Value":null,"ExpirationDate":null,"Weight":null,"DestinationIDs":null,"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factor":null,"Blocker":null},"Weight":10,"ActionsID":"LOG_WARNING","MinQueuedItems":0,"Executed":true,"LastExecutionTime":"2017-01-31T14:03:57.961651647+01:00"},{"ID":"STANDARD_TRIGGERS","UniqueID":"b8531413-10d5-47ad-81ad-2bc272e8f0ca","ThresholdType":"*max_event_counter","ThresholdValue":5,"Recurrent":false,"MinSleep":0,"ExpirationDate":"0001-01-01T00:00:00Z","ActivationDate":"0001-01-01T00:00:00Z","Balance":{"Uuid":null,"ID":null,"Type":"*monetary","Value":null,"ExpirationDate":null,"Weight":null,"DestinationIDs":{"FS_USERS":true},"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factor":null,"Blocker":null},"Weight":10,"ActionsID":"LOG_WARNING","MinQueuedItems":0,"Executed":false,"LastExecutionTime":"0001-01-01T00:00:00Z"},{"ID":"STANDARD_TRIGGERS","UniqueID":"8b424186-7a31-4aef-99c5-35e12e6fed41","ThresholdType":"*max_balance","ThresholdValue":20,"Recurrent":false,"MinSleep":0,"ExpirationDate":"0001-01-01T00:00:00Z","ActivationDate":"0001-01-01T00:00:00Z","Balance":{"Uuid":null,"ID":null,"Type":"*monetary","Value":null,"ExpirationDate":null,"Weight":null,"DestinationIDs":null,"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factor":null,"Blocker":null},"Weight":10,"ActionsID":"LOG_WARNING","MinQueuedItems":0,"Executed":false,"LastExecutionTime":"0001-01-01T00:00:00Z"},{"ID":"STANDARD_TRIGGERS","UniqueID":"28557f3b-139c-4a27-9d17-bda1f54b7c19","ThresholdType":"*max_balance","ThresholdValue":100,"Recurrent":false,"MinSleep":0,"ExpirationDate":"0001-01-01T00:00:00Z","ActivationDate":"0001-01-01T00:00:00Z","Balance":{"Uuid":null,"ID":null,"Type":"*monetary","Value":null,"ExpirationDate":null,"Weight":null,"DestinationIDs":null,"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factor":null,"Blocker":null},"Weight":10,"ActionsID":"DISABLE_AND_LOG","MinQueuedItems":0,"Executed":false,"LastExecutionTime":"0001-01-01T00:00:00Z"}],"AllowNegative":false,"Disabled":false}"`) + bev := []byte(`{"ID":"cgrates.org:1007","BalanceMap":{"*monetary":[{"Uuid":"367be35a-96ee-40a5-b609-9130661f5f12","ID":"","Value":0,"ExpirationDate":"0001-01-01T00:00:00Z","Weight":10,"DestinationIDs":{},"RatingSubject":"","Categories":{},"SharedGroups":{"SHARED_A":true},"Timings":null,"TimingIDs":{},"Disabled":false,"Factors":null,"Blocker":false}]},"UnitCounters":{"*monetary":[{"CounterType":"*event","Counters":[{"Value":0,"Filter":{"Uuid":null,"ID":"b8531413-10d5-47ad-81ad-2bc272e8f0ca","Type":"*monetary","Value":null,"ExpirationDate":null,"Weight":null,"DestinationIDs":{"FS_USERS":true},"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factors":null,"Blocker":null}}]}]},"ActionTriggers":[{"ID":"STANDARD_TRIGGERS","UniqueID":"46ac7b8c-685d-4555-bf73-fa6cfbc2fa21","ThresholdType":"*min_balance","ThresholdValue":2,"Recurrent":false,"MinSleep":0,"ExpirationDate":"0001-01-01T00:00:00Z","ActivationDate":"0001-01-01T00:00:00Z","Balance":{"Uuid":null,"ID":null,"Type":"*monetary","Value":null,"ExpirationDate":null,"Weight":null,"DestinationIDs":null,"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factors":null,"Blocker":null},"Weight":10,"ActionsID":"LOG_WARNING","MinQueuedItems":0,"Executed":true,"LastExecutionTime":"2017-01-31T14:03:57.961651647+01:00"},{"ID":"STANDARD_TRIGGERS","UniqueID":"b8531413-10d5-47ad-81ad-2bc272e8f0ca","ThresholdType":"*max_event_counter","ThresholdValue":5,"Recurrent":false,"MinSleep":0,"ExpirationDate":"0001-01-01T00:00:00Z","ActivationDate":"0001-01-01T00:00:00Z","Balance":{"Uuid":null,"ID":null,"Type":"*monetary","Value":null,"ExpirationDate":null,"Weight":null,"DestinationIDs":{"FS_USERS":true},"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factors":null,"Blocker":null},"Weight":10,"ActionsID":"LOG_WARNING","MinQueuedItems":0,"Executed":false,"LastExecutionTime":"0001-01-01T00:00:00Z"},{"ID":"STANDARD_TRIGGERS","UniqueID":"8b424186-7a31-4aef-99c5-35e12e6fed41","ThresholdType":"*max_balance","ThresholdValue":20,"Recurrent":false,"MinSleep":0,"ExpirationDate":"0001-01-01T00:00:00Z","ActivationDate":"0001-01-01T00:00:00Z","Balance":{"Uuid":null,"ID":null,"Type":"*monetary","Value":null,"ExpirationDate":null,"Weight":null,"DestinationIDs":null,"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factors":null,"Blocker":null},"Weight":10,"ActionsID":"LOG_WARNING","MinQueuedItems":0,"Executed":false,"LastExecutionTime":"0001-01-01T00:00:00Z"},{"ID":"STANDARD_TRIGGERS","UniqueID":"28557f3b-139c-4a27-9d17-bda1f54b7c19","ThresholdType":"*max_balance","ThresholdValue":100,"Recurrent":false,"MinSleep":0,"ExpirationDate":"0001-01-01T00:00:00Z","ActivationDate":"0001-01-01T00:00:00Z","Balance":{"Uuid":null,"ID":null,"Type":"*monetary","Value":null,"ExpirationDate":null,"Weight":null,"DestinationIDs":null,"RatingSubject":null,"Categories":null,"SharedGroups":null,"TimingIDs":null,"Timings":null,"Disabled":null,"Factors":null,"Blocker":null},"Weight":10,"ActionsID":"DISABLE_AND_LOG","MinQueuedItems":0,"Executed":false,"LastExecutionTime":"0001-01-01T00:00:00Z"}],"AllowNegative":false,"Disabled":false}"`) ev := &ees.ExportEvents{ Path: "http://localhost:2081", Format: utils.MetaHTTPjsonMap, diff --git a/cmd/cgr-console/cgr-console_it_test.go b/cmd/cgr-console/cgr-console_it_test.go index 54f3684ce..74840549d 100644 --- a/cmd/cgr-console/cgr-console_it_test.go +++ b/cmd/cgr-console/cgr-console_it_test.go @@ -2055,7 +2055,7 @@ func testConsoleItAccounts(t *testing.T) { "DestinationIDs": map[string]any{}, "Disabled": false, "ExpirationDate": "0001-01-01T00:00:00Z", - "Factor": nil, + "Factors": nil, "ID": "test", "RatingSubject": "", "SharedGroups": map[string]any{}, @@ -2474,7 +2474,7 @@ func testConsoleItTriggers(t *testing.T) { "DestinationIDs": nil, "Disabled": nil, "ExpirationDate": nil, - "Factor": nil, + "Factors": nil, "ID": nil, "RatingSubject": nil, "SharedGroups": nil, diff --git a/docs/rals.rst b/docs/rals.rst index 476acf25b..624a539bf 100644 --- a/docs/rals.rst +++ b/docs/rals.rst @@ -293,7 +293,7 @@ TimingIDs Disabled Makes the *Balance* invisible to charging. -Factor +Factors Used in case of of *\*generic* *BalanceType* to specify the conversion factors for different type of events. Blocker diff --git a/engine/account.go b/engine/account.go index 3a1183b3c..c747538ed 100644 --- a/engine/account.go +++ b/engine/account.go @@ -237,14 +237,14 @@ func (acc *Account) debitBalanceAction(a *Action, reset, resetIfNegative bool, f bClone.dirty = true // Mark the balance as dirty since we have modified and it should be checked by action triggers a.balanceValue = bClone.GetValue() bClone.Uuid = utils.GenUUID() // alway overwrite the uuid for consistency - // load ValueFactor if defined in extra parametrs + // load ValueFactors if defined in extra parametrs if a.ExtraParameters != "" { - vf := ValueFactor{} + vf := ValueFactors{} err := json.Unmarshal([]byte(a.ExtraParameters), &vf) if err == nil { - bClone.Factor = vf + bClone.Factors = vf } else { - utils.Logger.Warning(fmt.Sprintf("Could load value factor from actions: extra parametrs: %s", a.ExtraParameters)) + utils.Logger.Warning(fmt.Sprintf("Could load value factors from actions: extra parametrs: %s", a.ExtraParameters)) } } acc.BalanceMap[balanceType] = append(acc.BalanceMap[balanceType], bClone) diff --git a/engine/account_test.go b/engine/account_test.go index 1ceec4655..e6b840c0f 100644 --- a/engine/account_test.go +++ b/engine/account_test.go @@ -1738,7 +1738,7 @@ func TestDebitGenericBalance(t *testing.T) { utils.MetaGeneric: { &Balance{Uuid: "testm", Value: 100, Weight: 5, DestinationIDs: utils.StringMap{"NAT": true}, - Factor: ValueFactor{"call": 1 / (60 * float64(time.Second))}}}, + Factors: ValueFactors{"call": 1 / (60 * float64(time.Second))}}}, utils.MetaMonetary: {&Balance{Value: 21}}, }} var err error @@ -1795,7 +1795,7 @@ func TestDebitGenericBalanceWithRatingSubject(t *testing.T) { utils.MetaGeneric: { &Balance{Uuid: "testm", Value: 100, Weight: 5, DestinationIDs: utils.StringMap{"NAT": true}, - Factor: ValueFactor{"call": 1 / (60 * float64(time.Second))}, + Factors: ValueFactors{"call": 1 / (60 * float64(time.Second))}, RatingSubject: "free"}}, utils.MetaMonetary: {&Balance{Value: 21}}, }} diff --git a/engine/action.go b/engine/action.go index 2b380b34d..cd5c26070 100644 --- a/engine/action.go +++ b/engine/action.go @@ -1263,7 +1263,7 @@ func resetAccountCDR(ub *Account, action *Action, acts Actions, fltrS *FilterS, Value: &utils.ValueFormula{Static: bsum.Value}, Weight: &bsum.Weight, Disabled: &bsum.Disabled, - Factor: &bsum.Factors, + Factors: &bsum.Factors, }, }, fltrS); err != nil { utils.Logger.Warning(fmt.Sprintf("<%s> Error %s setting balance %s for account: %s", utils.Actions, err, bsum.UUID, account)) diff --git a/engine/actions_test.go b/engine/actions_test.go index e95c507b8..8745778bb 100644 --- a/engine/actions_test.go +++ b/engine/actions_test.go @@ -1076,7 +1076,7 @@ func TestActionTopupResetCredit(t *testing.T) { } } -func TestActionTopupValueFactor(t *testing.T) { +func TestActionTopupValueFactors(t *testing.T) { ub := &Account{ ID: "TEST_UB", BalanceMap: map[string]Balances{}, @@ -1090,9 +1090,9 @@ func TestActionTopupValueFactor(t *testing.T) { } topupResetAction(ub, a, nil, nil, nil, time.Now(), ActionConnCfg{}) if len(ub.BalanceMap) != 1 || - ub.BalanceMap[utils.MetaMonetary][0].Factor[utils.MetaMonetary] != 2.0 { - t.Errorf("Topup reset action failed to set Factor: %+v", - ub.BalanceMap[utils.MetaMonetary][0].Factor) + ub.BalanceMap[utils.MetaMonetary][0].Factors[utils.MetaMonetary] != 2.0 { + t.Errorf("Topup reset action failed to set Factors: %+v", + ub.BalanceMap[utils.MetaMonetary][0].Factors) } } diff --git a/engine/balance_filter.go b/engine/balance_filter.go index 83eaf26e4..ca75caa9e 100644 --- a/engine/balance_filter.go +++ b/engine/balance_filter.go @@ -42,7 +42,7 @@ type BalanceFilter struct { TimingIDs *utils.StringMap Timings []*RITiming Disabled *bool - Factor *ValueFactor + Factors *ValueFactors Blocker *bool } @@ -125,7 +125,7 @@ func (bp *BalanceFilter) CreateBalance() *Balance { Timings: bp.Timings, TimingIDs: bp.GetTimingIDs(), Disabled: bp.GetDisabled(), - Factor: bp.GetFactor(), + Factors: bp.GetFactor(), Blocker: bp.GetBlocker(), } return b.Clone() @@ -186,9 +186,9 @@ func (bf *BalanceFilter) Clone() *BalanceFilter { result.Disabled = new(bool) *result.Disabled = *bf.Disabled } - if bf.Factor != nil { - result.Factor = new(ValueFactor) - *result.Factor = *bf.Factor + if bf.Factors != nil { + result.Factors = new(ValueFactors) + *result.Factors = *bf.Factors } if bf.Blocker != nil { result.Blocker = new(bool) @@ -233,8 +233,8 @@ func (bf *BalanceFilter) LoadFromBalance(b *Balance) *BalanceFilter { copy(bf.Timings, b.Timings) } - if len(b.Factor) != 0 { - bf.Factor = &b.Factor + if len(b.Factors) != 0 { + bf.Factors = &b.Factors } if b.Disabled { bf.Disabled = &b.Disabled @@ -359,11 +359,11 @@ func (bp *BalanceFilter) GetExpirationDate() time.Time { return *bp.ExpirationDate } -func (bp *BalanceFilter) GetFactor() ValueFactor { - if bp == nil || bp.Factor == nil { - return ValueFactor{} +func (bp *BalanceFilter) GetFactor() ValueFactors { + if bp == nil || bp.Factors == nil { + return ValueFactors{} } - return *bp.Factor + return *bp.Factors } func (bp *BalanceFilter) EmptyExpirationDate() bool { @@ -479,11 +479,11 @@ func (bp *BalanceFilter) FieldAsInterface(fldPath []string) (val any, err error) return tm, nil } return tm.FieldAsInterface(fldPath[1:]) - case utils.Factor: - if bp.Factor == nil { + case utils.Factors: + if bp.Factors == nil { return nil, utils.ErrNotFound } - val, has := (*bp.Factor)[*indx] + val, has := (*bp.Factors)[*indx] if !has || len(fldPath) != 1 { return nil, utils.ErrNotFound } @@ -600,14 +600,14 @@ func (bp *BalanceFilter) FieldAsInterface(fldPath []string) (val any, err error) return nil, utils.ErrNotFound } return bp.TimingIDs.FieldAsInterface(fldPath[1:]) - case utils.Factor: + case utils.Factors: if len(fldPath) == 1 { - return bp.Factor, nil + return bp.Factors, nil } - if bp.Factor == nil { + if bp.Factors == nil { return nil, utils.ErrNotFound } - return bp.Factor.FieldAsInterface(fldPath[1:]) + return bp.Factors.FieldAsInterface(fldPath[1:]) case utils.Value: if len(fldPath) == 1 { return bp.Value, nil diff --git a/engine/balance_filter_test.go b/engine/balance_filter_test.go index 086265707..7c0937ffb 100644 --- a/engine/balance_filter_test.go +++ b/engine/balance_filter_test.go @@ -133,7 +133,7 @@ func TestBalanceFilterClone(t *testing.T) { {Months: utils.Months{4}}, }, Disabled: utils.BoolPointer(true), - Factor: &ValueFactor{AccountActionsCSVContent: 0.7}, + Factors: &ValueFactors{AccountActionsCSVContent: 0.7}, Blocker: utils.BoolPointer(true), } eOut = &BalanceFilter{ @@ -167,7 +167,7 @@ func TestBalanceFilterClone(t *testing.T) { {Months: utils.Months{4}}, }, Disabled: utils.BoolPointer(true), - Factor: &ValueFactor{AccountActionsCSVContent: 0.7}, + Factors: &ValueFactors{AccountActionsCSVContent: 0.7}, Blocker: utils.BoolPointer(true), } rcv := bf.Clone() @@ -194,7 +194,7 @@ func TestBalanceLoadFromBalance(t *testing.T) { SharedGroups: &utils.StringMap{}, Timings: []*RITiming{}, TimingIDs: &utils.StringMap{}, - Factor: &ValueFactor{}, + Factors: &ValueFactors{}, Disabled: utils.BoolPointer(true), Blocker: utils.BoolPointer(true), } @@ -231,8 +231,8 @@ func TestBalanceLoadFromBalance(t *testing.T) { TimingIDs: utils.StringMap{ "timing": true, }, - Factor: ValueFactor{ - "valfac": 1 / 22, + Factors: ValueFactors{ + "valfac": 1.0 / 22.0, }, Disabled: true, Blocker: true, @@ -273,8 +273,8 @@ func TestBalanceLoadFromBalance(t *testing.T) { TimingIDs: &utils.StringMap{ "timing": true, }, - Factor: &ValueFactor{ - "valfac": 1 / 22, + Factors: &ValueFactors{ + "valfac": 1.0 / 22.0, }, Disabled: utils.BoolPointer(true), Blocker: utils.BoolPointer(true), @@ -300,7 +300,7 @@ func TestBalanceFilterFieldAsInterface(t *testing.T) { t.Error(err) } else if _, err = bp.FieldAsInterface([]string{"Timings[indx]"}); err == nil { t.Error(err) - } else if _, err = bp.FieldAsInterface([]string{"Factor[indx]"}); err == nil || err != utils.ErrNotFound { + } else if _, err = bp.FieldAsInterface([]string{"Factors[indx]"}); err == nil || err != utils.ErrNotFound { t.Error(err) } else if _, err = bp.FieldAsInterface([]string{"Uuid"}); err != nil { t.Error(err) @@ -328,7 +328,7 @@ func TestBalanceFilterFieldAsInterface(t *testing.T) { t.Error(err) } else if _, err = bp.FieldAsInterface([]string{"TimingIDs"}); err != nil { t.Error(err) - } else if _, err = bp.FieldAsInterface([]string{"Factor"}); err != nil { + } else if _, err = bp.FieldAsInterface([]string{"Factors"}); err != nil { t.Error(err) } else if _, err = bp.FieldAsInterface([]string{"Value"}); err != nil { t.Error(err) @@ -370,7 +370,7 @@ func TestBalanceFilterFieldAsInterface(t *testing.T) { TimingIDs: &utils.StringMap{ "timing": true, }, - Factor: &ValueFactor{ + Factors: &ValueFactors{ "valfac": 22, }, Disabled: utils.BoolPointer(false), @@ -385,7 +385,7 @@ func TestBalanceFilterFieldAsInterface(t *testing.T) { t.Error(err) } else if _, err := bp.FieldAsInterface([]string{"TimingIDs[indx]"}); err == nil { t.Error(err) - } else if _, err := bp.FieldAsInterface([]string{"Factor[indx]"}); err == nil || err != utils.ErrNotFound { + } else if _, err := bp.FieldAsInterface([]string{"Factors[indx]"}); err == nil || err != utils.ErrNotFound { t.Error(err) } @@ -397,7 +397,7 @@ func TestBalanceFilterFieldAsInterface(t *testing.T) { t.Error(err) } else if _, err := bp.FieldAsInterface([]string{"TimingIDs[timing]"}); err != nil { t.Error(err) - } else if _, err := bp.FieldAsInterface([]string{"Factor[valfac]"}); err != nil { + } else if _, err := bp.FieldAsInterface([]string{"Factors[valfac]"}); err != nil { t.Error(err) } diff --git a/engine/balances.go b/engine/balances.go index ee7ef1b95..1978236c5 100644 --- a/engine/balances.go +++ b/engine/balances.go @@ -44,7 +44,7 @@ type Balance struct { Timings []*RITiming TimingIDs utils.StringMap Disabled bool - Factor ValueFactor + Factors ValueFactors Blocker bool precision int account *Account // used to store ub reference for shared balances @@ -184,7 +184,7 @@ func (b *Balance) Clone() *Balance { Blocker: b.Blocker, Disabled: b.Disabled, DestinationIDs: b.DestinationIDs, - Factor: b.Factor, + Factors: b.Factors, dirty: b.dirty, } if b.DestinationIDs != nil { @@ -349,8 +349,8 @@ func (b *Balance) debitUnits(cd *CallDescriptor, ub *Account, moneyBalances Bala //log.Printf("INCREMENET: %+v", inc) amount := float64(inc.Duration.Nanoseconds()) - if b.Factor != nil { - amount = utils.Round(amount/b.Factor.GetValue(cd.ToR), + if b.Factors != nil { + amount = utils.Round(amount/b.Factors.GetValue(cd.ToR), globalRoundingDecimals, utils.MetaRoundingUp) } if b.GetValue() >= amount { @@ -439,8 +439,8 @@ func (b *Balance) debitUnits(cd *CallDescriptor, ub *Account, moneyBalances Bala // debit minutes and money amount := float64(inc.Duration.Nanoseconds()) - if b.Factor != nil { - amount = utils.Round(amount/b.Factor.GetValue(cd.ToR), globalRoundingDecimals, utils.MetaRoundingUp) + if b.Factors != nil { + amount = utils.Round(amount/b.Factors.GetValue(cd.ToR), globalRoundingDecimals, utils.MetaRoundingUp) } cost := inc.Cost if strategy == utils.MetaMaxCostDisconnect && cd.MaxCostSoFar >= maxCost { @@ -688,7 +688,7 @@ func (b *Balance) AsBalanceSummary(typ string) *BalanceSummary { Value: b.Value, Weight: b.Weight, Disabled: b.Disabled, - Factors: b.Factor, + Factors: b.Factors, } if bd.ID == "" { bd.ID = b.Uuid @@ -783,9 +783,9 @@ func (bc Balances) SaveDirtyBalances(acc *Account, initBal map[string]float64) { } } -type ValueFactor map[string]float64 +type ValueFactors map[string]float64 -func (f ValueFactor) GetValue(category string) float64 { +func (f ValueFactors) GetValue(category string) float64 { if value, ok := f[category]; ok { return value } @@ -801,7 +801,7 @@ type BalanceSummary struct { Value float64 Weight float64 `json:",omitempty"` Disabled bool - Factors ValueFactor `json:",omitempty"` + Factors ValueFactors `json:",omitempty"` } // BalanceSummaries is a list of BalanceSummaries @@ -899,9 +899,9 @@ func (b *Balance) debit(cd *CallDescriptor, ub *Account, moneyBalances Balances, for incIndex, inc := range ts.Increments { //log.Printf("INCREMENET: %+v", inc) amount := float64(inc.Duration) - if b.Factor != nil { + if b.Factors != nil { amount = utils.Round( - amount*b.Factor.GetValue(cd.ExtraFields[utils.BalanceFactorID]), + amount*b.Factors.GetValue(cd.ExtraFields[utils.BalanceFactorID]), globalRoundingDecimals, utils.MetaRoundingUp) } if b.GetValue() >= amount { @@ -1044,9 +1044,9 @@ func (b *Balance) debit(cd *CallDescriptor, ub *Account, moneyBalances Balances, canDebitCost := b.GetValue() >= cost var moneyBal *Balance if isUnitBal { - if b.Factor != nil { + if b.Factors != nil { amount = utils.Round( - amount*b.Factor.GetValue(cd.ExtraFields[utils.BalanceFactorID]), + amount*b.Factors.GetValue(cd.ExtraFields[utils.BalanceFactorID]), globalRoundingDecimals, utils.MetaRoundingUp) } for _, mb := range moneyBalances { @@ -1224,8 +1224,8 @@ func (b *Balance) FieldAsInterface(fldPath []string) (val any, err error) { return tm, nil } return tm.FieldAsInterface(fldPath[1:]) - case utils.Factor: - val, has := b.Factor[*indx] + case utils.Factors: + val, has := b.Factors[*indx] if !has || len(fldPath) != 1 { return nil, utils.ErrNotFound } @@ -1301,11 +1301,11 @@ func (b *Balance) FieldAsInterface(fldPath []string) (val any, err error) { return nil, utils.ErrNotFound } return b.Disabled, nil - case utils.Factor: + case utils.Factors: if len(fldPath) == 1 { - return b.Factor, nil + return b.Factors, nil } - return b.Factor.FieldAsInterface(fldPath[1:]) + return b.Factors.FieldAsInterface(fldPath[1:]) case utils.Blocker: if len(fldPath) != 1 { return nil, utils.ErrNotFound @@ -1323,11 +1323,11 @@ func (b *Balance) FieldAsString(fldPath []string) (val string, err error) { return utils.IfaceAsString(iface), nil } -func (f ValueFactor) String() string { +func (f ValueFactors) String() string { return utils.ToJSON(f) } -func (f ValueFactor) FieldAsInterface(fldPath []string) (val any, err error) { +func (f ValueFactors) FieldAsInterface(fldPath []string) (val any, err error) { if f == nil || len(fldPath) != 1 { return nil, utils.ErrNotFound } @@ -1338,7 +1338,7 @@ func (f ValueFactor) FieldAsInterface(fldPath []string) (val any, err error) { return c, nil } -func (f ValueFactor) FieldAsString(fldPath []string) (val string, err error) { +func (f ValueFactors) FieldAsString(fldPath []string) (val string, err error) { var iface any iface, err = f.FieldAsInterface(fldPath) if err != nil { diff --git a/engine/balances_test.go b/engine/balances_test.go index 73b76773d..b70083bcd 100644 --- a/engine/balances_test.go +++ b/engine/balances_test.go @@ -341,7 +341,7 @@ func TestBalanceAsInterface(t *testing.T) { "timingid1": true, "timingid2": false, }, - Factor: ValueFactor{ + Factors: ValueFactors{ "factor1": 2.21, "factor2": 1.34, }, @@ -365,7 +365,7 @@ func TestBalanceAsInterface(t *testing.T) { t.Error(err) } else if _, err = b.FieldAsInterface([]string{"Timings[2]", "val"}); err == nil { t.Error(err) - } else if _, err = b.FieldAsInterface([]string{"Factor[factor1]", "secondVal"}); err == nil || err != utils.ErrNotFound { + } else if _, err = b.FieldAsInterface([]string{"Factors[factor1]", "secondVal"}); err == nil || err != utils.ErrNotFound { t.Error(err) } @@ -379,7 +379,7 @@ func TestBalanceAsInterface(t *testing.T) { t.Error(err) } else if _, err = b.FieldAsInterface([]string{"Timings[0]"}); err != nil { t.Error(err) - } else if _, err = b.FieldAsInterface([]string{"Factor[factor1]"}); err != nil { + } else if _, err = b.FieldAsInterface([]string{"Factors[factor1]"}); err != nil { t.Error(err) } if _, err = b.FieldAsInterface([]string{utils.Uuid}); err != nil { @@ -402,7 +402,7 @@ func TestBalanceAsInterface(t *testing.T) { t.Error(err) } else if _, err = b.FieldAsInterface([]string{utils.Disabled}); err != nil { t.Error(err) - } else if _, err = b.FieldAsInterface([]string{utils.Factor}); err != nil { + } else if _, err = b.FieldAsInterface([]string{utils.Factors}); err != nil { t.Error(err) } else if _, err = b.FieldAsInterface([]string{utils.Blocker}); err != nil { t.Error(err) @@ -434,8 +434,8 @@ func TestBalanceAsInterface(t *testing.T) { } -func TestValueFactorFieldAsInterface(t *testing.T) { - v := &ValueFactor{ +func TestValueFactorsFieldAsInterface(t *testing.T) { + v := &ValueFactors{ "FACT_VAL": 20.22, } if _, err := v.FieldAsInterface([]string{}); err == nil || err != utils.ErrNotFound { @@ -447,7 +447,7 @@ func TestValueFactorFieldAsInterface(t *testing.T) { } } func TestValueFactorFieldAsString(t *testing.T) { - v := &ValueFactor{ + v := &ValueFactors{ "FACT_VAL": 20.22, } if _, err = v.FieldAsString([]string{"TEST"}); err == nil { @@ -674,7 +674,7 @@ func TestBalanceDebitMoneyMaxCostFree(t *testing.T) { Disabled: false, precision: 2, RatingSubject: "*val34", - Factor: ValueFactor{ + Factors: ValueFactors{ "FACT_VAL": 20.22, }, } @@ -743,7 +743,7 @@ func TestBalanceDebitMoneyMaxCostDisconnect(t *testing.T) { Disabled: false, precision: 2, RatingSubject: "*val34", - Factor: ValueFactor{ + Factors: ValueFactors{ "FACT_VAL": 20.22, }, } @@ -830,7 +830,7 @@ func TestBalanceDebitMoney(t *testing.T) { ExpirationDate: time.Date(2022, 11, 1, 20, 0, 0, 0, time.UTC), precision: 2, RatingSubject: "*val34", - Factor: ValueFactor{ + Factors: ValueFactors{ "FACT_VAL": 20.22, }, } @@ -911,7 +911,7 @@ func TestBalanceDebitUnits2(t *testing.T) { Disabled: false, precision: 2, RatingSubject: "*val34", - Factor: ValueFactor{ + Factors: ValueFactors{ "FACT_VAL": 20.22, }, } @@ -1076,7 +1076,7 @@ func TestBalanceDebitUnits5(t *testing.T) { Disabled: false, precision: 2, RatingSubject: "*val34", - Factor: ValueFactor{ + Factors: ValueFactors{ "FACT_VAL": 20.22, }, } diff --git a/engine/eventcost_test.go b/engine/eventcost_test.go index 2ff705ab2..4e9f518a8 100644 --- a/engine/eventcost_test.go +++ b/engine/eventcost_test.go @@ -112,7 +112,7 @@ var testEC = &EventCost{ Initial: 60, Weight: 20, Disabled: false, - Factors: ValueFactor{ + Factors: ValueFactors{ "factor2": 2, "factor3": 3, }, @@ -125,7 +125,7 @@ var testEC = &EventCost{ Weight: 0, Initial: 60, Disabled: false, - Factors: ValueFactor{ + Factors: ValueFactors{ "factor2": 2, }, }, @@ -137,7 +137,7 @@ var testEC = &EventCost{ Weight: 10, Initial: 250, Disabled: true, - Factors: ValueFactor{ + Factors: ValueFactors{ "factor4": 4, "factor5": 5, }, @@ -2542,7 +2542,7 @@ func TestECSyncKeys(t *testing.T) { Initial: 60, Weight: 20, Disabled: false, - Factors: ValueFactor{ + Factors: ValueFactors{ "factor2": 2, "factor3": 3, }, @@ -2555,7 +2555,7 @@ func TestECSyncKeys(t *testing.T) { Initial: 60, Weight: 0, Disabled: false, - Factors: ValueFactor{ + Factors: ValueFactors{ "factor2": 2, }, }, @@ -2567,7 +2567,7 @@ func TestECSyncKeys(t *testing.T) { Initial: 250, Weight: 10, Disabled: true, - Factors: ValueFactor{ + Factors: ValueFactors{ "factor4": 4, "factor5": 5, }, @@ -3900,12 +3900,12 @@ func TestECAsDataProvider3(t *testing.T) { exp: "10", }, { - name: "Factor map", + name: "Factors map", fields: []string{"Charges[0]", "Increments[3]", "Accounting", "Balance", "Factors"}, exp: `{"factor4":4,"factor5":5}`, }, { - name: "Factor value", + name: "Factors value", fields: []string{"Charges[0]", "Increments[3]", "Accounting", "Balance", "Factors", "factor4"}, exp: "4", }, @@ -4080,12 +4080,12 @@ func TestECAsDataProvider3(t *testing.T) { exp: "20", }, { - name: "Factor map through ExtraCharge", + name: "Factors map through ExtraCharge", fields: []string{"Charges[0]", "Increments[3]", "Accounting", "ExtraCharge", "Balance", "Factors"}, exp: `{"factor2":2,"factor3":3}`, }, { - name: "Factor value through ExtraCharge", + name: "Factors value through ExtraCharge", fields: []string{"Charges[0]", "Increments[3]", "Accounting", "ExtraCharge", "Balance", "Factors", "factor3"}, exp: "3", }, diff --git a/migrator/accounts.go b/migrator/accounts.go index 57425db4b..22ce8846a 100644 --- a/migrator/accounts.go +++ b/migrator/accounts.go @@ -291,7 +291,7 @@ func (v1Acc v1Account) V1toV3Account() (ac *engine.Account) { Timings: oldBal.Timings, TimingIDs: utils.ParseStringMap(oldBal.TimingIDs), Disabled: oldBal.Disabled, - Factor: engine.ValueFactor{}, + Factors: engine.ValueFactors{}, } } } @@ -426,7 +426,7 @@ func (v2Acc v2Account) V2toV3Account() (ac *engine.Account) { Timings: oldBal.Timings, TimingIDs: oldBal.TimingIDs, Disabled: oldBal.Disabled, - Factor: oldBal.Factor, + Factors: oldBal.Factors, } } } diff --git a/migrator/accounts2_it_test.go b/migrator/accounts2_it_test.go index 5a8b63493..4e7ea283d 100644 --- a/migrator/accounts2_it_test.go +++ b/migrator/accounts2_it_test.go @@ -172,7 +172,7 @@ func testAcc2ITMigrate(t *testing.T) { SharedGroups: utils.NewStringMap(), Timings: timingSlice, TimingIDs: utils.NewStringMap(""), - Factor: engine.ValueFactor{}} + Factors: engine.ValueFactors{}} v2b := &engine.Balance{ Uuid: "", ID: "", Value: 0.0001, @@ -184,7 +184,7 @@ func testAcc2ITMigrate(t *testing.T) { SharedGroups: utils.NewStringMap(), Timings: timingSlice, TimingIDs: utils.NewStringMap(""), - Factor: engine.ValueFactor{}} + Factors: engine.ValueFactors{}} m2 := &engine.Balance{ Uuid: "", ID: "", @@ -196,7 +196,7 @@ func testAcc2ITMigrate(t *testing.T) { SharedGroups: utils.NewStringMap(), Timings: timingSlice, TimingIDs: utils.NewStringMap(""), - Factor: engine.ValueFactor{}} + Factors: engine.ValueFactors{}} testAccount := &engine.Account{ ID: "CUSTOMER_1:rif", BalanceMap: map[string]engine.Balances{ diff --git a/migrator/accounts_it_test.go b/migrator/accounts_it_test.go index ec47f6b8e..9735fd24d 100644 --- a/migrator/accounts_it_test.go +++ b/migrator/accounts_it_test.go @@ -245,7 +245,7 @@ func testAccITMigrateAndMove(t *testing.T) { SharedGroups: utils.NewStringMap(), Timings: timingSlice, TimingIDs: utils.NewStringMap(""), - Factor: engine.ValueFactor{}} + Factors: engine.ValueFactors{}} v2b := &engine.Balance{ Uuid: utils.EmptyString, ID: utils.EmptyString, Value: 0.0001, @@ -257,7 +257,7 @@ func testAccITMigrateAndMove(t *testing.T) { SharedGroups: utils.NewStringMap(), Timings: timingSlice, TimingIDs: utils.NewStringMap(""), - Factor: engine.ValueFactor{}} + Factors: engine.ValueFactors{}} m2 := &engine.Balance{ Uuid: utils.EmptyString, ID: utils.EmptyString, @@ -269,7 +269,7 @@ func testAccITMigrateAndMove(t *testing.T) { SharedGroups: utils.NewStringMap(), Timings: timingSlice, TimingIDs: utils.NewStringMap(""), - Factor: engine.ValueFactor{}} + Factors: engine.ValueFactors{}} testAccount := &engine.Account{ ID: "CUSTOMER_1:rif", BalanceMap: map[string]engine.Balances{ diff --git a/migrator/accounts_test.go b/migrator/accounts_test.go index f78fbac66..a41d7d659 100644 --- a/migrator/accounts_test.go +++ b/migrator/accounts_test.go @@ -72,7 +72,7 @@ func TestV1AccountAsAccount(t *testing.T) { SharedGroups: utils.NewStringMap(""), Timings: []*engine.RITiming{{StartTime: "00:00:00"}}, TimingIDs: utils.NewStringMap(""), - Factor: engine.ValueFactor{}, + Factors: engine.ValueFactors{}, } v2 := &engine.Balance{ Uuid: "", @@ -85,7 +85,7 @@ func TestV1AccountAsAccount(t *testing.T) { SharedGroups: utils.NewStringMap(""), Timings: []*engine.RITiming{{StartTime: "00:00:00"}}, TimingIDs: utils.NewStringMap(""), - Factor: engine.ValueFactor{}, + Factors: engine.ValueFactors{}, } m2 := &engine.Balance{ Uuid: "", @@ -97,7 +97,7 @@ func TestV1AccountAsAccount(t *testing.T) { SharedGroups: utils.NewStringMap(""), Timings: []*engine.RITiming{{StartTime: "00:00:00"}}, TimingIDs: utils.NewStringMap(""), - Factor: engine.ValueFactor{}, + Factors: engine.ValueFactors{}, } testAccount := &engine.Account{ ID: "CUSTOMER_1:rif", diff --git a/utils/consts.go b/utils/consts.go index 1f3f07853..8ced5bc78 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -876,7 +876,6 @@ const ( Weights = "Weights" UnitFactors = "UnitFactors" CostIncrements = "CostIncrements" - Factor = "Factor" Factors = "Factors" Method = "Method" Static = "Static"