diff --git a/migrator/accounts.go b/migrator/accounts.go index ee470ad75..fb22fbda2 100644 --- a/migrator/accounts.go +++ b/migrator/accounts.go @@ -18,6 +18,9 @@ along with this program. If not, see package migrator import ( + "fmt" + "log" + "strings" "time" "github.com/cgrates/cgrates/engine" @@ -70,3 +73,150 @@ type v1UnitsCounter struct { // Units float64 Balances v1BalanceChain // first balance is the general one (no destination) } + +func (v1Acc v1Account) AsAccount() (ac engine.Account, err error) { + // transfer data into new structurse + ac = engine.Account{ + ID: v1Acc.Id, + BalanceMap: make(map[string]engine.Balances, len(v1Acc.BalanceMap)), + UnitCounters: make(engine.UnitCounters, len(v1Acc.UnitCounters)), + ActionTriggers: make(engine.ActionTriggers, len(v1Acc.ActionTriggers)), + AllowNegative: v1Acc.AllowNegative, + Disabled: v1Acc.Disabled, + } + idElements := strings.Split(ac.ID, utils.CONCATENATED_KEY_SEP) + if len(idElements) != 3 { + log.Printf("Malformed account ID %s", v1Acc.Id) + } + ac.ID = fmt.Sprintf("%s:%s", idElements[1], idElements[2]) + // balances + for oldBalKey, oldBalChain := range v1Acc.BalanceMap { + keyElements := strings.Split(oldBalKey, "*") + newBalKey := "*" + keyElements[1] + newBalDirection := "*" + idElements[0] + ac.BalanceMap[newBalKey] = make(engine.Balances, len(oldBalChain)) + for index, oldBal := range oldBalChain { + // check default to set new id + ac.BalanceMap[newBalKey][index] = &engine.Balance{ + Uuid: oldBal.Uuid, + ID: oldBal.Id, + Value: oldBal.Value, + Directions: utils.ParseStringMap(newBalDirection), + ExpirationDate: oldBal.ExpirationDate, + Weight: oldBal.Weight, + DestinationIDs: utils.ParseStringMap(oldBal.DestinationIds), + RatingSubject: oldBal.RatingSubject, + Categories: utils.ParseStringMap(oldBal.Category), + SharedGroups: utils.ParseStringMap(oldBal.SharedGroup), + Timings: oldBal.Timings, + TimingIDs: utils.ParseStringMap(oldBal.TimingIDs), + Disabled: oldBal.Disabled, + } + } + } + // unit counters + for _, oldUc := range v1Acc.UnitCounters { + newUc := &engine.UnitCounter{Counters: make(engine.CounterFilters, len(oldUc.Balances))} + for index, oldUcBal := range oldUc.Balances { + bf := &engine.BalanceFilter{} + if oldUcBal.Uuid != "" { + bf.Uuid = utils.StringPointer(oldUcBal.Uuid) + } + if oldUcBal.Id != "" { + bf.ID = utils.StringPointer(oldUcBal.Id) + } + if oldUc.BalanceType != "" { + bf.Type = utils.StringPointer(oldUc.BalanceType) + } + if oldUc.Direction != "" { + bf.Directions = utils.StringMapPointer(utils.ParseStringMap(oldUc.Direction)) + } + if !oldUcBal.ExpirationDate.IsZero() { + bf.ExpirationDate = utils.TimePointer(oldUcBal.ExpirationDate) + } + if oldUcBal.Weight != 0 { + bf.Weight = utils.Float64Pointer(oldUcBal.Weight) + } + if oldUcBal.DestinationIds != "" { + bf.DestinationIDs = utils.StringMapPointer(utils.ParseStringMap(oldUcBal.DestinationIds)) + } + if oldUcBal.RatingSubject != "" { + bf.RatingSubject = utils.StringPointer(oldUcBal.RatingSubject) + } + if oldUcBal.Category != "" { + bf.Categories = utils.StringMapPointer(utils.ParseStringMap(oldUcBal.Category)) + } + if oldUcBal.SharedGroup != "" { + bf.SharedGroups = utils.StringMapPointer(utils.ParseStringMap(oldUcBal.SharedGroup)) + } + if oldUcBal.TimingIDs != "" { + bf.TimingIDs = utils.StringMapPointer(utils.ParseStringMap(oldUcBal.TimingIDs)) + } + if oldUcBal.Disabled != false { + bf.Disabled = utils.BoolPointer(oldUcBal.Disabled) + } + bf.Timings = oldUcBal.Timings + cf := &engine.CounterFilter{ + Value: oldUcBal.Value, + Filter: bf, + } + newUc.Counters[index] = cf + } + ac.UnitCounters[oldUc.BalanceType] = append(ac.UnitCounters[oldUc.BalanceType], newUc) + } + //action triggers + for index, oldAtr := range v1Acc.ActionTriggers { + at := &engine.ActionTrigger{ + UniqueID: oldAtr.Id, + ThresholdType: oldAtr.ThresholdType, + ThresholdValue: oldAtr.ThresholdValue, + Recurrent: oldAtr.Recurrent, + MinSleep: oldAtr.MinSleep, + Weight: oldAtr.Weight, + ActionsID: oldAtr.ActionsId, + MinQueuedItems: oldAtr.MinQueuedItems, + Executed: oldAtr.Executed, + } + bf := &engine.BalanceFilter{} + if oldAtr.BalanceId != "" { + bf.ID = utils.StringPointer(oldAtr.BalanceId) + } + if oldAtr.BalanceType != "" { + bf.Type = utils.StringPointer(oldAtr.BalanceType) + } + if oldAtr.BalanceRatingSubject != "" { + bf.RatingSubject = utils.StringPointer(oldAtr.BalanceRatingSubject) + } + if oldAtr.BalanceDirection != "" { + bf.Directions = utils.StringMapPointer(utils.ParseStringMap(oldAtr.BalanceDirection)) + } + if oldAtr.BalanceDestinationIds != "" { + bf.DestinationIDs = utils.StringMapPointer(utils.ParseStringMap(oldAtr.BalanceDestinationIds)) + } + if oldAtr.BalanceTimingTags != "" { + bf.TimingIDs = utils.StringMapPointer(utils.ParseStringMap(oldAtr.BalanceTimingTags)) + } + if oldAtr.BalanceCategory != "" { + bf.Categories = utils.StringMapPointer(utils.ParseStringMap(oldAtr.BalanceCategory)) + } + if oldAtr.BalanceSharedGroup != "" { + bf.SharedGroups = utils.StringMapPointer(utils.ParseStringMap(oldAtr.BalanceSharedGroup)) + } + if oldAtr.BalanceWeight != 0 { + bf.Weight = utils.Float64Pointer(oldAtr.BalanceWeight) + } + if oldAtr.BalanceDisabled != false { + bf.Disabled = utils.BoolPointer(oldAtr.BalanceDisabled) + } + if !oldAtr.BalanceExpirationDate.IsZero() { + bf.ExpirationDate = utils.TimePointer(oldAtr.BalanceExpirationDate) + } + at.Balance = bf + ac.ActionTriggers[index] = at + if ac.ActionTriggers[index].ThresholdType == "*min_counter" || + ac.ActionTriggers[index].ThresholdType == "*max_counter" { + ac.ActionTriggers[index].ThresholdType = strings.Replace(ac.ActionTriggers[index].ThresholdType, "_", "_event_", 1) + } + } + return +} diff --git a/migrator/accounts_test.go b/migrator/accounts_test.go new file mode 100644 index 000000000..895f19715 --- /dev/null +++ b/migrator/accounts_test.go @@ -0,0 +1,49 @@ +/* +Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments +Copyright (C) ITsysCOM GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ +package migrator + +import ( + "reflect" + "testing" + + "github.com/cgrates/cgrates/engine" + "github.com/cgrates/cgrates/utils" +) + +func TestV1AccountAsAccount(t *testing.T) { + v1b1 := &v1Balance{Value: 10, Weight: 10, DestinationIds: "NAT"} + v1Acc := &v1Account{Id: "OUT:CUSTOMER_1:rif", BalanceMap: map[string]v1BalanceChain{utils.VOICE: v1BalanceChain{v1b1}, utils.MONETARY: v1BalanceChain{&v1Balance{Value: 21}}}} + + v2 := &engine.Balance{Uuid: "", ID: "", Value: 10, Directions: utils.StringMap{"*OUT": true}, Weight: 10, DestinationIDs: utils.StringMap{"NAT": true}, RatingSubject: "", Categories: utils.NewStringMap(""), SharedGroups: utils.NewStringMap(""), TimingIDs: utils.NewStringMap("")} + m2 := &engine.Balance{Uuid: "", ID: "", Value: 21, Directions: utils.StringMap{"*OUT": true}, DestinationIDs: utils.NewStringMap(""), RatingSubject: "", Categories: utils.NewStringMap(""), SharedGroups: utils.NewStringMap(""), TimingIDs: utils.NewStringMap("")} + testAccount := &engine.Account{ID: "CUSTOMER_1:rif", BalanceMap: map[string]engine.Balances{utils.VOICE: engine.Balances{v2}, utils.MONETARY: engine.Balances{m2}}, UnitCounters: engine.UnitCounters{}, ActionTriggers: engine.ActionTriggers{}} + + def := v1b1.IsDefault() + if def != false { + t.Errorf("Expecting: false, received: true") + } + + newAcc, err := v1Acc.AsAccount() + if err != nil { + t.Error(err) + } + if !reflect.DeepEqual(*testAccount, newAcc) { + t.Errorf("Expecting: %+v, received: %+v", *testAccount, newAcc) + t.Errorf(" \n") + } +} diff --git a/migrator/action_triggers_test.go b/migrator/action_triggers_test.go index c727dd571..e2e7cec18 100644 --- a/migrator/action_triggers_test.go +++ b/migrator/action_triggers_test.go @@ -28,7 +28,7 @@ import ( var v1ActionTriggers1 = `[{"BalanceType": "*monetary","BalanceDirection": "*out","ThresholdType":"*max_balance", "ThresholdValue" :2, "ActionsId": "TEST_ACTIONS", "Executed": true}]` -func TestV1ActionTriggersAsActionTriggers1(t *testing.T) { +func TestV1ActionTriggersAsActionTriggers(t *testing.T) { atrs := engine.ActionTriggers{&engine.ActionTrigger{ Balance: &engine.BalanceFilter{ Type: utils.StringPointer(utils.MONETARY), @@ -50,15 +50,3 @@ func TestV1ActionTriggersAsActionTriggers1(t *testing.T) { t.Errorf("Expecting: %+v, received: %+v", atrs, newatrs) } } - -//var v1ActionTriggers2 = `[{"BalanceType": "utils.MONETARY", "ThresholdValue" :2, "ActionsId": "TEST_ACTIONS", "Executed": true}]` -// func TestV1ActionTriggersAsActionTriggers2(t *testing.T) { -// var v1actstrgrs v1ActionTriggers -// if err := json.Unmarshal([]byte(v1ActionTriggers2), &v1actstrgrs); err != nil { -// t.Error(err) -// } -// v1Act := &v1actstrgrs -// if _, err := v1Act.AsActionTriggers(); err != nil { -// t.Error(err) -// } -// }