diff --git a/apier/v1/accounts.go b/apier/v1/accounts.go index 40bd8e346..6ee1fbe4c 100644 --- a/apier/v1/accounts.go +++ b/apier/v1/accounts.go @@ -34,12 +34,12 @@ type AttrAcntAction struct { type AccountActionTiming struct { Id string // The id to reference this particular ActionTiming - ActionTimingsId string // The id of the ActionTimings profile attached to the account + ActionPlanId string // The id of the ActionPlanId profile attached to the account ActionsId string // The id of actions which will be executed NextExecTime time.Time // Next execution time } -func (self *ApierV1) GetAccountActionTimings(attrs AttrAcntAction, reply *[]*AccountActionTiming) error { +func (self *ApierV1) GetAccountActionPlan(attrs AttrAcntAction, reply *[]*AccountActionTiming) error { if missing := utils.MissingStructFields(&attrs, []string{"Tenant", "Account", "Direction"}); len(missing) != 0 { return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } @@ -51,7 +51,7 @@ func (self *ApierV1) GetAccountActionTimings(attrs AttrAcntAction, reply *[]*Acc for _, ats := range allATs { for _, at := range ats { if utils.IsSliceMember(at.UserBalanceIds, utils.BalanceKey(attrs.Tenant, attrs.Account, attrs.Direction)) { - accountATs = append(accountATs, &AccountActionTiming{Id: at.Id, ActionTimingsId: at.Tag, ActionsId: at.ActionsId, NextExecTime: at.GetNextStartTime()}) + accountATs = append(accountATs, &AccountActionTiming{Id: at.Id, ActionPlanId: at.Tag, ActionsId: at.ActionsId, NextExecTime: at.GetNextStartTime()}) } } } @@ -60,7 +60,7 @@ func (self *ApierV1) GetAccountActionTimings(attrs AttrAcntAction, reply *[]*Acc } type AttrRemActionTiming struct { - ActionTimingsId string // Id identifying the ActionTimings profile + ActionPlanId string // Id identifying the ActionTimings profile ActionTimingId string // Internal CGR id identifying particular ActionTiming, *all for all user related ActionTimings to be canceled Tenant string // Tenant he account belongs to Account string // Account name @@ -70,7 +70,7 @@ type AttrRemActionTiming struct { // Removes an ActionTimings or parts of it depending on filters being set func (self *ApierV1) RemActionTiming(attrs AttrRemActionTiming, reply *string) error { - if missing := utils.MissingStructFields(&attrs, []string{"ActionTimingsId"}); len(missing) != 0 { // Only mandatory ActionTimingsId + if missing := utils.MissingStructFields(&attrs, []string{"ActionPlanId"}); len(missing) != 0 { // Only mandatory ActionPlanId return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } if len(attrs.Account) != 0 { // Presence of Account requires complete account details to be provided @@ -79,14 +79,14 @@ func (self *ApierV1) RemActionTiming(attrs AttrRemActionTiming, reply *string) e } } _, err := engine.AccLock.Guard(engine.ACTION_TIMING_PREFIX, func() (float64, error) { - ats, err := self.AccountDb.GetActionTimings(attrs.ActionTimingsId) + ats, err := self.AccountDb.GetActionTimings(attrs.ActionPlanId) if err != nil { return 0, err } else if len(ats) == 0 { return 0, errors.New(utils.ERR_NOT_FOUND) } ats = engine.RemActionTiming(ats, attrs.ActionTimingId, utils.BalanceKey(attrs.Tenant, attrs.Account, attrs.Direction)) - if err := self.AccountDb.SetActionTimings(attrs.ActionTimingsId, ats); err != nil { + if err := self.AccountDb.SetActionTimings(attrs.ActionPlanId, ats); err != nil { return 0, err } return 0, nil @@ -161,7 +161,7 @@ type AttrSetAccount struct { Direction string Account string Type string // <*prepaid|*postpaid> - ActionTimingsId string + ActionPlanId string } // Ads a new account into dataDb. If already defined, returns success. @@ -187,9 +187,9 @@ func (self *ApierV1) SetAccount(attr AttrSetAccount, reply *string) error { } } - if len(attr.ActionTimingsId) != 0 { + if len(attr.ActionPlanId) != 0 { var err error - ats, err = self.AccountDb.GetActionTimings(attr.ActionTimingsId) + ats, err = self.AccountDb.GetActionTimings(attr.ActionPlanId) if err != nil { return 0, err } @@ -208,7 +208,7 @@ func (self *ApierV1) SetAccount(attr AttrSetAccount, reply *string) error { } if len(ats) != 0 { _, err := engine.AccLock.Guard(engine.ACTION_TIMING_PREFIX, func() (float64, error) { // ToDo: Try locking it above on read somehow - if err := self.AccountDb.SetActionTimings(attr.ActionTimingsId, ats); err != nil { + if err := self.AccountDb.SetActionTimings(attr.ActionPlanId, ats); err != nil { return 0, err } return 0, nil diff --git a/apier/v1/apier.go b/apier/v1/apier.go index e86890e8f..81055cc3f 100644 --- a/apier/v1/apier.go +++ b/apier/v1/apier.go @@ -287,10 +287,10 @@ func (self *ApierV1) SetActions(attrs AttrSetActions, reply *string) error { return nil } -type AttrSetActionTimings struct { - ActionTimingsId string // Profile id +type AttrSetActionPlan struct { + Id string // Profile id + ActionPlan []*ApiActionTiming // Set of actions this Actions profile will perform Overwrite bool // If previously defined, will be overwritten - ActionTimings []*ApiActionTiming // Set of actions this Actions profile will perform ReloadScheduler bool // Enables automatic reload of the scheduler (eg: useful when adding a single action timing) } @@ -304,25 +304,25 @@ type ApiActionTiming struct { Weight float64 // Binding's weight } -func (self *ApierV1) SetActionTimings(attrs AttrSetActionTimings, reply *string) error { - if missing := utils.MissingStructFields(&attrs, []string{"ActionTimingsId", "ActionTimings"}); len(missing) != 0 { +func (self *ApierV1) SetActionPlan(attrs AttrSetActionPlan, reply *string) error { + if missing := utils.MissingStructFields(&attrs, []string{"Id", "ActionPlan"}); len(missing) != 0 { return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } - for _, at := range attrs.ActionTimings { + for _, at := range attrs.ActionPlan { requiredFields := []string{"ActionsId", "Time", "Weight"} if missing := utils.MissingStructFields(at, requiredFields); len(missing) != 0 { return fmt.Errorf("%s:Action:%s:%v", utils.ERR_MANDATORY_IE_MISSING, at.ActionsId, missing) } } if !attrs.Overwrite { - if exists, err := self.AccountDb.ExistsData(engine.ACTION_TIMING_PREFIX, attrs.ActionTimingsId); err != nil { + if exists, err := self.AccountDb.ExistsData(engine.ACTION_TIMING_PREFIX, attrs.Id); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } else if exists { return errors.New(utils.ERR_EXISTS) } } - storeAtms := make(engine.ActionTimings, len(attrs.ActionTimings)) - for idx, apiAtm := range attrs.ActionTimings { + storeAtms := make(engine.ActionTimings, len(attrs.ActionPlan)) + for idx, apiAtm := range attrs.ActionPlan { if exists, err := self.AccountDb.ExistsData(engine.ACTION_PREFIX, apiAtm.ActionsId); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } else if !exists { @@ -336,17 +336,20 @@ func (self *ApierV1) SetActionTimings(attrs AttrSetActionTimings, reply *string) timing.StartTime = apiAtm.Time at := &engine.ActionTiming{ Id: utils.GenUUID(), - Tag: attrs.ActionTimingsId, + Tag: attrs.Id, Weight: apiAtm.Weight, Timing: &engine.RateInterval{Timing: timing}, ActionsId: apiAtm.ActionsId, } storeAtms[idx] = at } - if err := self.AccountDb.SetActionTimings(attrs.ActionTimingsId, storeAtms); err != nil { + if err := self.AccountDb.SetActionTimings(attrs.Id, storeAtms); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } - if attrs.ReloadScheduler && self.Sched != nil { + if attrs.ReloadScheduler { + if self.Sched == nil { + return errors.New("SCHEDULER_NOT_ENABLED") + } self.Sched.LoadActionTimings(self.AccountDb) self.Sched.Restart() } @@ -534,7 +537,7 @@ func (self *ApierV1) LoadTariffPlanFromFolder(attrs AttrLoadTPFromFolder, reply path.Join(attrs.FolderPath, utils.RATING_PLANS_CSV), path.Join(attrs.FolderPath, utils.RATING_PROFILES_CSV), path.Join(attrs.FolderPath, utils.ACTIONS_CSV), - path.Join(attrs.FolderPath, utils.ACTION_TIMINGS_CSV), + path.Join(attrs.FolderPath, utils.ACTION_PLANS_CSV), path.Join(attrs.FolderPath, utils.ACTION_TRIGGERS_CSV), path.Join(attrs.FolderPath, utils.ACCOUNT_ACTIONS_CSV)) if err := loader.LoadAll(); err != nil { diff --git a/apier/v1/apier_local_test.go b/apier/v1/apier_local_test.go index c083e6e82..901a0fd76 100644 --- a/apier/v1/apier_local_test.go +++ b/apier/v1/apier_local_test.go @@ -549,51 +549,51 @@ func TestApierTPActionTimings(t *testing.T) { return } reply := "" - at := &utils.TPActionTimings{TPid: engine.TEST_SQL, ActionTimingsId: "PREPAID_10", ActionTimings: []*utils.TPActionTiming{ + at := &utils.TPActionPlan{TPid: engine.TEST_SQL, Id: "PREPAID_10", ActionPlan: []*utils.TPActionTiming{ &utils.TPActionTiming{ActionsId: "PREPAID_10", TimingId: "ASAP", Weight: 10}, }} - atTst := new(utils.TPActionTimings) + atTst := new(utils.TPActionPlan) *atTst = *at - atTst.ActionTimingsId = engine.TEST_SQL - for _, act := range []*utils.TPActionTimings{at, atTst} { - if err := rater.Call("ApierV1.SetTPActionTimings", act, &reply); err != nil { - t.Error("Got error on ApierV1.SetTPActionTimings: ", err.Error()) + atTst.Id = engine.TEST_SQL + for _, act := range []*utils.TPActionPlan{at, atTst} { + if err := rater.Call("ApierV1.SetTPActionPlan", act, &reply); err != nil { + t.Error("Got error on ApierV1.SetTPActionPlan: ", err.Error()) } else if reply != "OK" { - t.Error("Unexpected reply received when calling ApierV1.SetTPActionTimings: ", reply) + t.Error("Unexpected reply received when calling ApierV1.SetTPActionPlan: ", reply) } } // Check second set - if err := rater.Call("ApierV1.SetTPActionTimings", atTst, &reply); err != nil { - t.Error("Got error on second ApierV1.SetTPActionTimings: ", err.Error()) + if err := rater.Call("ApierV1.SetTPActionPlan", atTst, &reply); err != nil { + t.Error("Got error on second ApierV1.SetTPActionPlan: ", err.Error()) } else if reply != "OK" { - t.Error("Calling ApierV1.SetTPActionTimings got reply: ", reply) + t.Error("Calling ApierV1.SetTPActionPlan got reply: ", reply) } // Check missing params - if err := rater.Call("ApierV1.SetTPActionTimings", new(utils.TPActionTimings), &reply); err == nil { - t.Error("Calling ApierV1.SetTPActionTimings, expected error, received: ", reply) - } else if err.Error() != "MANDATORY_IE_MISSING:[TPid ActionTimingsId ActionTimings]" { - t.Error("Calling ApierV1.SetTPActionTimings got unexpected error: ", err.Error()) + if err := rater.Call("ApierV1.SetTPActionPlan", new(utils.TPActionPlan), &reply); err == nil { + t.Error("Calling ApierV1.SetTPActionPlan, expected error, received: ", reply) + } else if err.Error() != "MANDATORY_IE_MISSING:[TPid Id ActionPlan]" { + t.Error("Calling ApierV1.SetTPActionPlan got unexpected error: ", err.Error()) } // Test get - var rplyActs *utils.TPActionTimings - if err := rater.Call("ApierV1.GetTPActionTimings", AttrGetTPActionTimings{TPid: atTst.TPid, ActionTimingsId: atTst.ActionTimingsId}, &rplyActs); err != nil { - t.Error("Calling ApierV1.GetTPActionTimings, got error: ", err.Error()) + var rplyActs *utils.TPActionPlan + if err := rater.Call("ApierV1.GetTPActionPlan", AttrGetTPActionPlan{TPid: atTst.TPid, Id: atTst.Id}, &rplyActs); err != nil { + t.Error("Calling ApierV1.GetTPActionPlan, got error: ", err.Error()) } else if !reflect.DeepEqual(atTst, rplyActs) { - t.Errorf("Calling ApierV1.GetTPActionTimings expected: %v, received: %v", atTst, rplyActs) + t.Errorf("Calling ApierV1.GetTPActionPlan expected: %v, received: %v", atTst, rplyActs) } // Test remove - if err := rater.Call("ApierV1.RemTPActionTimings", AttrGetTPActionTimings{TPid: atTst.TPid, ActionTimingsId: atTst.ActionTimingsId}, &reply); err != nil { - t.Error("Calling ApierV1.RemTPActionTimings, got error: ", err.Error()) + if err := rater.Call("ApierV1.RemTPActionPlan", AttrGetTPActionPlan{TPid: atTst.TPid, Id: atTst.Id}, &reply); err != nil { + t.Error("Calling ApierV1.RemTPActionPlan, got error: ", err.Error()) } else if reply != "OK" { - t.Error("Calling ApierV1.RemTPActionTimings received: ", reply) + t.Error("Calling ApierV1.RemTPActionPlan received: ", reply) } // Test getIds var rplyIds []string expectedIds := []string{"PREPAID_10"} - if err := rater.Call("ApierV1.GetTPActionTimingIds", AttrGetTPActionTimingIds{TPid: atTst.TPid}, &rplyIds); err != nil { - t.Error("Calling ApierV1.GetTPActionTimingIds, got error: ", err.Error()) + if err := rater.Call("ApierV1.GetTPActionPlanIds", AttrGetTPActionPlanIds{TPid: atTst.TPid}, &rplyIds); err != nil { + t.Error("Calling ApierV1.GetTPActionPlanIds, got error: ", err.Error()) } else if !reflect.DeepEqual(expectedIds, rplyIds) { - t.Errorf("Calling ApierV1.GetTPActionTimingIds expected: %v, received: %v", expectedIds, rplyIds) + t.Errorf("Calling ApierV1.GetTPActionPlanIds expected: %v, received: %v", expectedIds, rplyIds) } } @@ -657,15 +657,15 @@ func TestApierTPAccountActions(t *testing.T) { } reply := "" aa1 := &utils.TPAccountActions{TPid: engine.TEST_SQL, LoadId: engine.TEST_SQL, Tenant: "cgrates.org", - Account: "1001", Direction: "*out", ActionTimingsId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"} + Account: "1001", Direction: "*out", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"} aa2 := &utils.TPAccountActions{TPid: engine.TEST_SQL, LoadId: engine.TEST_SQL, Tenant: "cgrates.org", - Account: "1002", Direction: "*out", ActionTimingsId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"} + Account: "1002", Direction: "*out", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"} aa3 := &utils.TPAccountActions{TPid: engine.TEST_SQL, LoadId: engine.TEST_SQL, Tenant: "cgrates.org", - Account: "1003", Direction: "*out", ActionTimingsId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"} + Account: "1003", Direction: "*out", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"} aa4 := &utils.TPAccountActions{TPid: engine.TEST_SQL, LoadId: engine.TEST_SQL, Tenant: "cgrates.org", - Account: "1004", Direction: "*out", ActionTimingsId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"} + Account: "1004", Direction: "*out", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"} aa5 := &utils.TPAccountActions{TPid: engine.TEST_SQL, LoadId: engine.TEST_SQL, Tenant: "cgrates.org", - Account: "1005", Direction: "*out", ActionTimingsId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"} + Account: "1005", Direction: "*out", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"} aaTst := new(utils.TPAccountActions) *aaTst = *aa1 aaTst.Account = engine.TEST_SQL @@ -685,7 +685,7 @@ func TestApierTPAccountActions(t *testing.T) { // Check missing params if err := rater.Call("ApierV1.SetTPAccountActions", new(utils.TPAccountActions), &reply); err == nil { t.Error("Calling ApierV1.SetTPAccountActions, expected error, received: ", reply) - } else if err.Error() != "MANDATORY_IE_MISSING:[TPid LoadId Tenant Account Direction ActionTimingsId ActionTriggersId]" { + } else if err.Error() != "MANDATORY_IE_MISSING:[TPid LoadId Tenant Account Direction ActionPlanId ActionTriggersId]" { t.Error("Calling ApierV1.SetTPAccountActions got unexpected error: ", err.Error()) } // Test get @@ -981,15 +981,15 @@ func TestApierSetActionTimings(t *testing.T) { return } atm1 := &ApiActionTiming{ActionsId: "ACTS_1", MonthDays: "1", Time: "00:00:00", Weight: 20.0} - atms1 := &AttrSetActionTimings{ActionTimingsId: "ATMS_1", ActionTimings: []*ApiActionTiming{atm1}} + atms1 := &AttrSetActionPlan{Id: "ATMS_1", ActionPlan: []*ApiActionTiming{atm1}} reply1 := "" - if err := rater.Call("ApierV1.SetActionTimings", atms1, &reply1); err != nil { - t.Error("Got error on ApierV1.SetActionTimings: ", err.Error()) + if err := rater.Call("ApierV1.SetActionPlan", atms1, &reply1); err != nil { + t.Error("Got error on ApierV1.SetActionPlan: ", err.Error()) } else if reply1 != "OK" { - t.Errorf("Calling ApierV1.SetActionTimings received: %s", reply1) + t.Errorf("Calling ApierV1.SetActionPlan received: %s", reply1) } // Calling the second time should raise EXISTS - if err := rater.Call("ApierV1.SetActionTimings", atms1, &reply1); err == nil || err.Error() != "EXISTS" { + if err := rater.Call("ApierV1.SetActionPlan", atms1, &reply1); err == nil || err.Error() != "EXISTS" { t.Error("Unexpected result on duplication: ", err.Error()) } } @@ -1068,7 +1068,7 @@ func TestApierSetAccount(t *testing.T) { return } reply := "" - attrs := &AttrSetAccount{Tenant: "cgrates.org", Direction: "*out", Account: "dan7", Type: "*prepaid", ActionTimingsId: "ATMS_1"} + attrs := &AttrSetAccount{Tenant: "cgrates.org", Direction: "*out", Account: "dan7", Type: "*prepaid", ActionPlanId: "ATMS_1"} if err := rater.Call("ApierV1.SetAccount", attrs, &reply); err != nil { t.Error("Got error on ApierV1.SetAccount: ", err.Error()) } else if reply != "OK" { @@ -1077,7 +1077,7 @@ func TestApierSetAccount(t *testing.T) { reply2 := "" attrs2 := new(AttrSetAccount) *attrs2 = *attrs - attrs2.ActionTimingsId = "DUMMY_DATA" // Does not exist so it should error when adding triggers on it + attrs2.ActionPlanId = "DUMMY_DATA" // Does not exist so it should error when adding triggers on it // Add account with actions timing which does not exist if err := rater.Call("ApierV1.SetAccount", attrs2, &reply2); err == nil || reply2 == "OK" { // OK is not welcomed t.Error("Expecting error on ApierV1.SetAccount.", err, reply2) @@ -1086,19 +1086,19 @@ func TestApierSetAccount(t *testing.T) { // Test here GetAccountActionTimings -func TestApierGetAccountActionTimings(t *testing.T) { +func TestApierGetAccountActionPlan(t *testing.T) { if !*testLocal { return } var reply []*AccountActionTiming req := AttrAcntAction{Tenant: "cgrates.org", Account:"dan7", Direction: "*out"} - if err := rater.Call("ApierV1.GetAccountActionTimings", req, &reply); err != nil { - t.Error("Got error on ApierV1.GetAccountActionTimings: ", err.Error()) + if err := rater.Call("ApierV1.GetAccountActionPlan", req, &reply); err != nil { + t.Error("Got error on ApierV1.GetAccountActionPlan: ", err.Error()) } else if len(reply) != 1 { - t.Error("Unexpected action timings received") + t.Error("Unexpected action plan received") } else { - if reply[0].ActionTimingsId != "ATMS_1" { - t.Errorf("Unexpected ActionTImingsId received") + if reply[0].ActionPlanId != "ATMS_1" { + t.Errorf("Unexpected ActionPlanId received") } } } @@ -1109,7 +1109,7 @@ func TestApierRemActionTiming(t *testing.T) { return } var rmReply string - rmReq := AttrRemActionTiming{ActionTimingsId: "ATMS_1", Tenant: "cgrates.org", Account:"dan4", Direction: "*out"} + rmReq := AttrRemActionTiming{ActionPlanId: "ATMS_1", Tenant: "cgrates.org", Account:"dan4", Direction: "*out"} if err := rater.Call("ApierV1.RemActionTiming", rmReq, &rmReply); err != nil { t.Error("Got error on ApierV1.RemActionTiming: ", err.Error()) } else if rmReply != OK { @@ -1117,8 +1117,8 @@ func TestApierRemActionTiming(t *testing.T) { } var reply []*AccountActionTiming req := AttrAcntAction{Tenant: "cgrates.org", Account:"dan4", Direction: "*out"} - if err := rater.Call("ApierV1.GetAccountActionTimings", req, &reply); err != nil { - t.Error("Got error on ApierV1.GetAccountActionTimings: ", err.Error()) + if err := rater.Call("ApierV1.GetAccountActionPlan", req, &reply); err != nil { + t.Error("Got error on ApierV1.GetAccountActionPlan: ", err.Error()) } else if len(reply) != 0 { t.Error("Action timings was not removed") } diff --git a/apier/v1/tpaccountactions.go b/apier/v1/tpaccountactions.go index 4ffa7caee..989ed05f1 100644 --- a/apier/v1/tpaccountactions.go +++ b/apier/v1/tpaccountactions.go @@ -27,7 +27,7 @@ import ( // Creates a new AccountActions profile within a tariff plan func (self *ApierV1) SetTPAccountActions(attrs utils.TPAccountActions, reply *string) error { if missing := utils.MissingStructFields(&attrs, - []string{"TPid", "LoadId", "Tenant", "Account", "Direction", "ActionTimingsId", "ActionTriggersId"}); len(missing) != 0 { + []string{"TPid", "LoadId", "Tenant", "Account", "Direction", "ActionPlanId", "ActionTriggersId"}); len(missing) != 0 { return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } if err := self.StorDb.SetTPAccountActions(attrs.TPid, map[string]*utils.TPAccountActions{attrs.KeyId(): &attrs}); err != nil { diff --git a/apier/v1/tpactiontimings.go b/apier/v1/tpactiontimings.go index 308c914d9..ec9210fb9 100644 --- a/apier/v1/tpactiontimings.go +++ b/apier/v1/tpactiontimings.go @@ -25,50 +25,50 @@ import ( ) // Creates a new ActionTimings profile within a tariff plan -func (self *ApierV1) SetTPActionTimings(attrs utils.TPActionTimings, reply *string) error { - if missing := utils.MissingStructFields(&attrs, []string{"TPid", "ActionTimingsId", "ActionTimings"}); len(missing) != 0 { +func (self *ApierV1) SetTPActionPlan(attrs utils.TPActionPlan, reply *string) error { + if missing := utils.MissingStructFields(&attrs, []string{"TPid", "Id", "ActionPlan"}); len(missing) != 0 { return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } - for _, at := range attrs.ActionTimings { + for _, at := range attrs.ActionPlan { requiredFields := []string{"ActionsId", "TimingId", "Weight"} if missing := utils.MissingStructFields(at, requiredFields); len(missing) != 0 { return fmt.Errorf("%s:Action:%s:%v", utils.ERR_MANDATORY_IE_MISSING, at.ActionsId, missing) } } - if err := self.StorDb.SetTPActionTimings(attrs.TPid, map[string][]*utils.TPActionTiming{attrs.ActionTimingsId: attrs.ActionTimings}); err != nil { + if err := self.StorDb.SetTPActionTimings(attrs.TPid, map[string][]*utils.TPActionTiming{attrs.Id: attrs.ActionPlan}); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } *reply = "OK" return nil } -type AttrGetTPActionTimings struct { +type AttrGetTPActionPlan struct { TPid string // Tariff plan id - ActionTimingsId string // ActionTimings id + Id string // ActionTimings id } -// Queries specific ActionTimings profile on tariff plan -func (self *ApierV1) GetTPActionTimings(attrs AttrGetTPActionTimings, reply *utils.TPActionTimings) error { - if missing := utils.MissingStructFields(&attrs, []string{"TPid", "ActionTimingsId"}); len(missing) != 0 { //Params missing +// Queries specific ActionPlan profile on tariff plan +func (self *ApierV1) GetTPActionPlan(attrs AttrGetTPActionPlan, reply *utils.TPActionPlan) error { + if missing := utils.MissingStructFields(&attrs, []string{"TPid", "Id"}); len(missing) != 0 { //Params missing return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } - if ats, err := self.StorDb.GetTPActionTimings(attrs.TPid, attrs.ActionTimingsId); err != nil { + if ats, err := self.StorDb.GetTPActionTimings(attrs.TPid, attrs.Id); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } else if len(ats) == 0 { return errors.New(utils.ERR_NOT_FOUND) } else { // Got the data we need, convert it - atRply := &utils.TPActionTimings{attrs.TPid, attrs.ActionTimingsId, ats[attrs.ActionTimingsId]} + atRply := &utils.TPActionPlan{attrs.TPid, attrs.Id, ats[attrs.Id]} *reply = *atRply } return nil } -type AttrGetTPActionTimingIds struct { +type AttrGetTPActionPlanIds struct { TPid string // Tariff plan id } -// Queries ActionTimings identities on specific tariff plan. -func (self *ApierV1) GetTPActionTimingIds(attrs AttrGetTPActionTimingIds, reply *[]string) error { +// Queries ActionPlan identities on specific tariff plan. +func (self *ApierV1) GetTPActionPlanIds(attrs AttrGetTPActionPlanIds, reply *[]string) error { if missing := utils.MissingStructFields(&attrs, []string{"TPid"}); len(missing) != 0 { //Params missing return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } @@ -82,12 +82,12 @@ func (self *ApierV1) GetTPActionTimingIds(attrs AttrGetTPActionTimingIds, reply return nil } -// Removes specific ActionTimings on Tariff plan -func (self *ApierV1) RemTPActionTimings(attrs AttrGetTPActionTimings, reply *string) error { - if missing := utils.MissingStructFields(&attrs, []string{"TPid", "ActionTimingsId"}); len(missing) != 0 { //Params missing +// Removes specific ActionPlan on Tariff plan +func (self *ApierV1) RemTPActionPlan(attrs AttrGetTPActionPlan, reply *string) error { + if missing := utils.MissingStructFields(&attrs, []string{"TPid", "Id"}); len(missing) != 0 { //Params missing return fmt.Errorf("%s:%v", utils.ERR_MANDATORY_IE_MISSING, missing) } - if err := self.StorDb.RemTPData(utils.TBL_TP_ACTION_TIMINGS, attrs.TPid, attrs.ActionTimingsId); err != nil { + if err := self.StorDb.RemTPData(utils.TBL_TP_ACTION_PLANS, attrs.TPid, attrs.Id); err != nil { return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error()) } else { *reply = "OK" diff --git a/cmd/cgr-loader/cgr-loader.go b/cmd/cgr-loader/cgr-loader.go index 6293b993d..97940905e 100644 --- a/cmd/cgr-loader/cgr-loader.go +++ b/cmd/cgr-loader/cgr-loader.go @@ -140,7 +140,7 @@ func main() { path.Join(*dataPath, utils.RATING_PLANS_CSV), path.Join(*dataPath, utils.RATING_PROFILES_CSV), path.Join(*dataPath, utils.ACTIONS_CSV), - path.Join(*dataPath, utils.ACTION_TIMINGS_CSV), + path.Join(*dataPath, utils.ACTION_PLANS_CSV), path.Join(*dataPath, utils.ACTION_TRIGGERS_CSV), path.Join(*dataPath, utils.ACCOUNT_ACTIONS_CSV)) } diff --git a/console/add_account.go b/console/add_account.go index ade30f214..b38642b65 100644 --- a/console/add_account.go +++ b/console/add_account.go @@ -56,7 +56,7 @@ func (self *CmdAddAccount) FromArgs(args []string) error { self.rpcParams.Tenant = args[2] self.rpcParams.Account = args[3] self.rpcParams.Type = args[4] - self.rpcParams.ActionTimingsId = args[5] + self.rpcParams.ActionPlanId = args[5] if len(args) > 6 { self.rpcParams.Direction = args[6] } diff --git a/data/storage/mysql/create_tariffplan_tables.sql b/data/storage/mysql/create_tariffplan_tables.sql index b53403b45..4ad5bcb83 100644 --- a/data/storage/mysql/create_tariffplan_tables.sql +++ b/data/storage/mysql/create_tariffplan_tables.sql @@ -139,8 +139,8 @@ CREATE TABLE `tp_actions` ( -- Table structure for table `tp_action_timings` -- -DROP TABLE IF EXISTS `tp_action_timings`; -CREATE TABLE `tp_action_timings` ( +DROP TABLE IF EXISTS `tp_action_plans`; +CREATE TABLE `tp_action_plans` ( `id` int(11) NOT NULL AUTO_INCREMENT, `tpid` varchar(64) NOT NULL, `tag` varchar(64) NOT NULL, diff --git a/data/tariffplans/fs_germany_prep1/AccountActions.csv b/data/tariffplans/fs_germany_prep1/AccountActions.csv deleted file mode 100644 index cf7bc4026..000000000 --- a/data/tariffplans/fs_germany_prep1/AccountActions.csv +++ /dev/null @@ -1,6 +0,0 @@ -#Tenant,Account,Direction,ActionTimingsTag,ActionTriggersTag -cgrates.org,1001,*out,PREPAID_10,STANDARD_TRIGGERS -cgrates.org,1002,*out,PREPAID_10,STANDARD_TRIGGERS -cgrates.org,1003,*out,PREPAID_10,STANDARD_TRIGGERS -cgrates.org,1004,*out,PREPAID_10,STANDARD_TRIGGERS -cgrates.org,1005,*out,PREPAID_10,STANDARD_TRIGGERS diff --git a/data/tariffplans/fs_germany_prep1/ActionTriggers.csv b/data/tariffplans/fs_germany_prep1/ActionTriggers.csv deleted file mode 100644 index 22d063dfa..000000000 --- a/data/tariffplans/fs_germany_prep1/ActionTriggers.csv +++ /dev/null @@ -1,4 +0,0 @@ -#Tag,BalanceType,Direction,ThresholdType,ThresholdValue,DestinationTag,ActionsTag,Weight -STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,,LOG_BALANCE,10 -STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,,LOG_BALANCE,10 -STANDARD_TRIGGERS,*monetary,*out,*max_counter,15,FS_USERS,LOG_BALANCE,10 diff --git a/data/tariffplans/fs_germany_prep1/Actions.csv b/data/tariffplans/fs_germany_prep1/Actions.csv deleted file mode 100644 index 620e17566..000000000 --- a/data/tariffplans/fs_germany_prep1/Actions.csv +++ /dev/null @@ -1,2 +0,0 @@ -#ActionsTag,Action,BalanceType,Direction,Units,ExpiryTime,DestinationTag,RatingSubject,BalanceWeight,ExtraParameters,Weight -PREPAID_10,*topup_reset,*monetary,*out,10,*unlimited,*any,,10,,10 diff --git a/data/tariffplans/fs_germany_prep1/DestinationRates.csv b/data/tariffplans/fs_germany_prep1/DestinationRates.csv deleted file mode 100644 index 1812d2efd..000000000 --- a/data/tariffplans/fs_germany_prep1/DestinationRates.csv +++ /dev/null @@ -1,6 +0,0 @@ -#Tag,DestinationsTag,RatesTag -DR_RETAIL_PEAK,GERMANY,LANDLINE_PEAK -DR_RETAIL_PEAK,GERMANY_MOBILE,MOBILE_PEAK -DR_RETAIL_OFFPEAK,GERMANY,LANDLINE_OFFPEAK -DR_RETAIL_OFFPEAK,GERMANY_MOBILE,MOBILE_OFFPEAK -DR_FREESWITCH_USERS,FS_USERS,RT_FS_USERS diff --git a/data/tariffplans/fs_germany_prep1/Destinations.csv b/data/tariffplans/fs_germany_prep1/Destinations.csv deleted file mode 100644 index 8ee6689cb..000000000 --- a/data/tariffplans/fs_germany_prep1/Destinations.csv +++ /dev/null @@ -1,6 +0,0 @@ -#Tag,Prefix -GERMANY,+49 -GERMANY_MOBILE,+4915 -GERMANY_MOBILE,+4916 -GERMANY_MOBILE,+4917 -FS_USERS,10 diff --git a/data/tariffplans/fs_germany_prep1/README.md b/data/tariffplans/fs_germany_prep1/README.md deleted file mode 100644 index 32ff027ac..000000000 --- a/data/tariffplans/fs_germany_prep1/README.md +++ /dev/null @@ -1,15 +0,0 @@ -CGRateS - FSGermanyPrep1 -========================== - -Scenario: ---------- - -* Create the necessary timings (always, peak, offpeak, asap). -* Configure 3 different destinations: GERMANY, GERMANY_MOBILE and FS_USERS. -* Calls to landline and mobile numbers in Germany will be charged time based (structured in peak and offpeak profiles). Calls to landline during peak times are charged using different rate slots: first minute charged as a whole at one rate, next minutes charged per second at another rate. -* Calls to FreeSWITCH users will be free and time independent. -* This rating profile will be valid for any rating subject. - -* Create 5 prepaid accounts (equivalent of 5 FreeSWITCH default test users - 1001, 1002, 1003, 1004, 1005). -* Add to each of the accounts a monetary balance of 10 units. -* For each balance created, attach 3 triggers to control the balance: log on balance=2, log on balance=20, log on 15 mins talked towards FS_USERS destination. diff --git a/data/tariffplans/fs_germany_prep1/Rates.csv b/data/tariffplans/fs_germany_prep1/Rates.csv deleted file mode 100644 index 23615c56c..000000000 --- a/data/tariffplans/fs_germany_prep1/Rates.csv +++ /dev/null @@ -1,7 +0,0 @@ -#Tag,ConnectFee,Rate,RateUnit,RateIncrement,GroupIntervalStart,RoundingMethod,RoundingDecimals -LANDLINE_PEAK,0.02,0.02,60s,60s,0s,*up,4 -LANDLINE_PEAK,0.02,0.01,1s,1s,60s,*up,4 -MOBILE_PEAK,0.02,0.14,60s,60s,0s,*up,4 -LANDLINE_OFFPEAK,1,0,60s,60s,0s,*up,4 -MOBILE_OFFPEAK,0.02,0.1,60s,60s,0,*up,4 -RT_FS_USERS,0,0,60s,60s,0s,*up,0 diff --git a/data/tariffplans/fs_germany_prep1/RatingPlans.csv b/data/tariffplans/fs_germany_prep1/RatingPlans.csv deleted file mode 100644 index c47aeafd6..000000000 --- a/data/tariffplans/fs_germany_prep1/RatingPlans.csv +++ /dev/null @@ -1,6 +0,0 @@ -#Tag,DestinationRatesTag,TimingTag,Weight -RETAIL1,DR_RETAIL_PEAK,PEAK,10 -RETAIL1,DR_RETAIL_OFFPEAK,OFFPEAK_MORNING,10 -RETAIL1,DR_RETAIL_OFFPEAK,OFFPEAK_EVENING,10 -RETAIL1,DR_RETAIL_OFFPEAK,WEEKEND,10 -RETAIL1,DR_FREESWITCH_USERS,ALWAYS,10 diff --git a/data/tariffplans/fs_germany_prep1/RatingProfiles.csv b/data/tariffplans/fs_germany_prep1/RatingProfiles.csv deleted file mode 100644 index 4c7c1dbd3..000000000 --- a/data/tariffplans/fs_germany_prep1/RatingProfiles.csv +++ /dev/null @@ -1,2 +0,0 @@ -#Tenant,TOR,Direction,Subject,ActivationTime,RatingPlanTag,FallbackSubject -cgrates.org,call,*out,*any,2012-01-01T00:00:00Z,RETAIL1, diff --git a/data/tariffplans/fs_germany_prep1/Timings.csv b/data/tariffplans/fs_germany_prep1/Timings.csv deleted file mode 100644 index 9b24e6975..000000000 --- a/data/tariffplans/fs_germany_prep1/Timings.csv +++ /dev/null @@ -1,7 +0,0 @@ -#Tag,Years,Months,MonthDays,WeekDays,Time -ALWAYS,*any,*any,*any,*any,00:00:00 -ASAP,*any,*any,*any,*any,*asap -OFFPEAK_MORNING,*any,*any,*any,1;2;3;4;5,00:00:00 -PEAK,*any,*any,*any,1;2;3;4;5,08:00:00 -OFFPEAK_EVENING,*any,*any,*any,1;2;3;4;5,20:00:00 -WEEKEND,*any,*any,*any,6;7,00:00:00 diff --git a/data/tariffplans/fs_germany_prep1/ActionTimings.csv b/data/tariffplans/prepaid1centpsec/ActionPlans.csv similarity index 100% rename from data/tariffplans/fs_germany_prep1/ActionTimings.csv rename to data/tariffplans/prepaid1centpsec/ActionPlans.csv diff --git a/data/tariffplans/prepaid1centpsec/ActionTimings.csv b/data/tariffplans/prepaid1centpsec/ActionTimings.csv deleted file mode 100644 index 24f63c8a8..000000000 --- a/data/tariffplans/prepaid1centpsec/ActionTimings.csv +++ /dev/null @@ -1,2 +0,0 @@ -#Tag,ActionsTag,TimingTag,Weight -PREPAID_10,PREPAID_10,ASAP,10 diff --git a/engine/loader_csv.go b/engine/loader_csv.go index 4c944f7dc..c4bc94b4b 100644 --- a/engine/loader_csv.go +++ b/engine/loader_csv.go @@ -500,7 +500,7 @@ func (csvr *CSVReader) LoadActions() (err error) { } func (csvr *CSVReader) LoadActionTimings() (err error) { - csvReader, fp, err := csvr.readerFunc(csvr.actiontimingsFn, csvr.sep, utils.ACTION_TIMINGS_NRCOLS) + csvReader, fp, err := csvr.readerFunc(csvr.actiontimingsFn, csvr.sep, utils.ACTION_PLANS_NRCOLS) if err != nil { log.Print("Could not load action timings file: ", err) // allow writing of the other values diff --git a/engine/loader_db.go b/engine/loader_db.go index c78f87896..84356e494 100644 --- a/engine/loader_db.go +++ b/engine/loader_db.go @@ -492,9 +492,9 @@ func (dbr *DbReader) LoadAccountActions() (err error) { ActionTriggers: aTriggers, } dbr.accountActions = append(dbr.accountActions, ub) - aTimings, exists := dbr.actionsTimings[aa.ActionTimingsId] + aTimings, exists := dbr.actionsTimings[aa.ActionPlanId] if !exists { - log.Printf("Could not get action timing for tag %v", aa.ActionTimingsId) + log.Printf("Could not get action timing for tag %v", aa.ActionPlanId) // must not continue here } for _, at := range aTimings { @@ -513,23 +513,23 @@ func (dbr *DbReader) LoadAccountActionsFiltered(qriedAA *utils.TPAccountActions) id := accountAction.KeyId() var actionsIds []string // collects action ids // action timings - if accountAction.ActionTimingsId != "" { + if accountAction.ActionPlanId != "" { // get old userBalanceIds var exitingUserBalanceIds []string - existingActionTimings, err := dbr.accountDb.GetActionTimings(accountAction.ActionTimingsId) + existingActionTimings, err := dbr.accountDb.GetActionTimings(accountAction.ActionPlanId) if err == nil && len(existingActionTimings) > 0 { // all action timings from a specific tag shuld have the same list of user balances from the first one exitingUserBalanceIds = existingActionTimings[0].UserBalanceIds } - actionTimingsMap, err := dbr.storDb.GetTPActionTimings(dbr.tpid, accountAction.ActionTimingsId) + actionTimingsMap, err := dbr.storDb.GetTPActionTimings(dbr.tpid, accountAction.ActionPlanId) if err != nil { return err } else if len(actionTimingsMap) == 0 { - return fmt.Errorf("No ActionTimings with id <%s>", accountAction.ActionTimingsId) + return fmt.Errorf("No ActionTimings with id <%s>", accountAction.ActionPlanId) } var actionTimings []*ActionTiming - ats := actionTimingsMap[accountAction.ActionTimingsId] + ats := actionTimingsMap[accountAction.ActionPlanId] for _, at := range ats { // Check action exists before saving it inside actionTiming key // ToDo: try saving the key after the actions was retrieved in order to save one query here. @@ -547,7 +547,7 @@ func (dbr *DbReader) LoadAccountActionsFiltered(qriedAA *utils.TPAccountActions) t := timingsMap[at.TimingId] actTmg := &ActionTiming{ Id: utils.GenUUID(), - Tag: accountAction.ActionTimingsId, + Tag: accountAction.ActionPlanId, Weight: at.Weight, Timing: &RateInterval{ Timing: &RITiming{ @@ -576,7 +576,7 @@ func (dbr *DbReader) LoadAccountActionsFiltered(qriedAA *utils.TPAccountActions) } // write action timings - err = dbr.accountDb.SetActionTimings(accountAction.ActionTimingsId, actionTimings) + err = dbr.accountDb.SetActionTimings(accountAction.ActionPlanId, actionTimings) if err != nil { return err } diff --git a/engine/loader_helpers.go b/engine/loader_helpers.go index d189734f2..602436237 100644 --- a/engine/loader_helpers.go +++ b/engine/loader_helpers.go @@ -201,7 +201,7 @@ var FileValidators = map[string]*FileLineRegexValidator{ utils.ACTIONS_CSV: &FileLineRegexValidator{utils.ACTIONS_NRCOLS, regexp.MustCompile(`(?:\w+\s*),(?:\*\w+\s*),(?:\*\w+\s*)?,(?:\*out\s*)?,(?:\d+\s*)?,(?:\*\w+\s*|\+\d+[smh]\s*|\d+\s*)?,(?:\*any|\w+\s*)?,(?:\*\w+\s*)?,(?:\d+\.?\d*\s*)?,(?:\S+\s*)?,(?:\d+\.?\d*\s*)$`), "Tag([0-9A-Za-z_]),Action([0-9A-Za-z_]),BalanceType([*a-z_]),Direction(*out),Units([0-9]),ExpiryTime(*[a-z_]|+[0-9][smh]|[0-9])DestinationTag([0-9A-Za-z_]|*all),RatingSubject([0-9A-Za-z_]),BalanceWeight([0-9.]),ExtraParameters([0-9A-Za-z_:;]),Weight([0-9.])"}, - utils.ACTION_TIMINGS_CSV: &FileLineRegexValidator{utils.ACTION_TIMINGS_NRCOLS, + utils.ACTION_PLANS_CSV: &FileLineRegexValidator{utils.ACTION_PLANS_NRCOLS, regexp.MustCompile(`(?:\w+\s*,\s*){3}(?:\d+\.?\d*){1}`), "Tag([0-9A-Za-z_]),ActionsTag([0-9A-Za-z_]),TimingTag([0-9A-Za-z_]),Weight([0-9.])"}, utils.ACTION_TRIGGERS_CSV: &FileLineRegexValidator{utils.ACTION_TRIGGERS_NRCOLS, diff --git a/engine/loader_helpers_test.go b/engine/loader_helpers_test.go index 6faa92e71..94e07a582 100644 --- a/engine/loader_helpers_test.go +++ b/engine/loader_helpers_test.go @@ -251,7 +251,7 @@ func TestActionsValidator(t *testing.T) { func TestActionTimingsValidator(t *testing.T) { reader := bufio.NewReader(strings.NewReader(actionTimingsSample)) - lnValidator := FileValidators[utils.ACTION_TIMINGS_CSV] + lnValidator := FileValidators[utils.ACTION_PLANS_CSV] lineNr := 0 for { lineNr++ diff --git a/engine/loader_local_test.go b/engine/loader_local_test.go index fd446eaf8..52ccfa77b 100644 --- a/engine/loader_local_test.go +++ b/engine/loader_local_test.go @@ -126,7 +126,7 @@ func TestLoadFromCSV(t *testing.T) { path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.RATING_PLANS_CSV), path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.RATING_PROFILES_CSV), path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.ACTIONS_CSV), - path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.ACTION_TIMINGS_CSV), + path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.ACTION_PLANS_CSV), path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.ACTION_TRIGGERS_CSV), path.Join(*dataDir, "tariffplans", *tpCsvScenario, utils.ACCOUNT_ACTIONS_CSV), ) diff --git a/engine/storage_interface.go b/engine/storage_interface.go index ca07d11cf..323991b9e 100644 --- a/engine/storage_interface.go +++ b/engine/storage_interface.go @@ -32,7 +32,7 @@ import ( ) const ( - ACTION_TIMING_PREFIX = "atm_" + ACTION_TIMING_PREFIX = "apl_" RATING_PLAN_PREFIX = "rpl_" RATING_PROFILE_PREFIX = "rpf_" ACTION_PREFIX = "act_" diff --git a/engine/storage_sql.go b/engine/storage_sql.go index fa57d834a..7fcd09aee 100644 --- a/engine/storage_sql.go +++ b/engine/storage_sql.go @@ -479,7 +479,7 @@ func (self *SQLStorage) SetTPActionTimings(tpid string, ats map[string][]*utils. return nil //Nothing to set } var buffer bytes.Buffer - buffer.WriteString(fmt.Sprintf("INSERT INTO %s (tpid,tag,actions_tag,timing_tag,weight) VALUES ", utils.TBL_TP_ACTION_TIMINGS)) + buffer.WriteString(fmt.Sprintf("INSERT INTO %s (tpid,tag,actions_tag,timing_tag,weight) VALUES ", utils.TBL_TP_ACTION_PLANS)) i := 0 for atId, atRows := range ats { for _, at := range atRows { @@ -499,7 +499,7 @@ func (self *SQLStorage) SetTPActionTimings(tpid string, ats map[string][]*utils. func (self *SQLStorage) GetTPActionTimings(tpid, atId string) (map[string][]*utils.TPActionTiming, error) { ats := make(map[string][]*utils.TPActionTiming) - q := fmt.Sprintf("SELECT tag,actions_tag,timing_tag,weight FROM %s WHERE tpid='%s'", utils.TBL_TP_ACTION_TIMINGS, tpid) + q := fmt.Sprintf("SELECT tag,actions_tag,timing_tag,weight FROM %s WHERE tpid='%s'", utils.TBL_TP_ACTION_PLANS, tpid) if atId != "" { q += fmt.Sprintf(" AND tag='%s'", atId) } @@ -522,7 +522,7 @@ func (self *SQLStorage) GetTPActionTimings(tpid, atId string) (map[string][]*uti } func (self *SQLStorage) GetTPActionTimingIds(tpid string) ([]string, error) { - rows, err := self.Db.Query(fmt.Sprintf("SELECT DISTINCT tag FROM %s where tpid='%s'", utils.TBL_TP_ACTION_TIMINGS, tpid)) + rows, err := self.Db.Query(fmt.Sprintf("SELECT DISTINCT tag FROM %s where tpid='%s'", utils.TBL_TP_ACTION_PLANS, tpid)) if err != nil { return nil, err } @@ -604,7 +604,7 @@ func (self *SQLStorage) SetTPAccountActions(tpid string, aa map[string]*utils.TP buffer.WriteRune(',') } buffer.WriteString(fmt.Sprintf("('%s','%s','%s','%s','%s','%s','%s')", - tpid, aActs.LoadId, aActs.Tenant, aActs.Account, aActs.Direction, aActs.ActionTimingsId, aActs.ActionTriggersId)) + tpid, aActs.LoadId, aActs.Tenant, aActs.Account, aActs.Direction, aActs.ActionPlanId, aActs.ActionTriggersId)) i++ } buffer.WriteString(" ON DUPLICATE KEY UPDATE action_timings_tag=values(action_timings_tag), action_triggers_tag=values(action_triggers_tag)") @@ -1119,7 +1119,7 @@ func (self *SQLStorage) GetTpAccountActions(aaFltr *utils.TPAccountActions) (map Tenant: tenant, Account: account, Direction: direction, - ActionTimingsId: action_timings_tag, + ActionPlanId: action_timings_tag, ActionTriggersId: action_triggers_tag, } aa[aacts.KeyId()] = aacts diff --git a/engine/storage_sql_local_test.go b/engine/storage_sql_local_test.go index d4391355a..0d9e6b8fa 100644 --- a/engine/storage_sql_local_test.go +++ b/engine/storage_sql_local_test.go @@ -111,7 +111,7 @@ func TestRemoveData(t *testing.T) { // Create AccountActions aa := &utils.TPAccountActions{TPid: TEST_SQL, LoadId: TEST_SQL, Tenant: "cgrates.org", Account: "1001", - Direction: "*out", ActionTimingsId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"} + Direction: "*out", ActionPlanId: "PREPAID_10", ActionTriggersId: "STANDARD_TRIGGERS"} if err := mysql.SetTPAccountActions(aa.TPid, map[string]*utils.TPAccountActions{aa.KeyId(): aa}); err != nil { t.Error(err.Error()) } diff --git a/engine/tpimporter_csv.go b/engine/tpimporter_csv.go index f9635bf7d..5fc8bb9a5 100644 --- a/engine/tpimporter_csv.go +++ b/engine/tpimporter_csv.go @@ -47,7 +47,7 @@ var fileHandlers = map[string]func(*TPCSVImporter, string) error{ utils.RATING_PLANS_CSV: (*TPCSVImporter).importRatingPlans, utils.RATING_PROFILES_CSV: (*TPCSVImporter).importRatingProfiles, utils.ACTIONS_CSV: (*TPCSVImporter).importActions, - utils.ACTION_TIMINGS_CSV: (*TPCSVImporter).importActionTimings, + utils.ACTION_PLANS_CSV: (*TPCSVImporter).importActionTimings, utils.ACTION_TRIGGERS_CSV: (*TPCSVImporter).importActionTriggers, utils.ACCOUNT_ACTIONS_CSV: (*TPCSVImporter).importAccountActions, } @@ -467,7 +467,7 @@ func (self *TPCSVImporter) importAccountActions(fn string) error { loadId += "_" + self.ImportId } tpaa := &utils.TPAccountActions{TPid: self.TPid, LoadId: loadId, Tenant: tenant, Account: account, Direction: direction, - ActionTimingsId: actionTimingsTag, ActionTriggersId: actionTriggersTag} + ActionPlanId: actionTimingsTag, ActionTriggersId: actionTriggersTag} aa := map[string]*utils.TPAccountActions{tpaa.KeyId(): tpaa} if err := self.StorDb.SetTPAccountActions(self.TPid, aa); err != nil { if self.Verbose { diff --git a/utils/apitpdata.go b/utils/apitpdata.go index d7a054985..b1e0f58b1 100644 --- a/utils/apitpdata.go +++ b/utils/apitpdata.go @@ -220,10 +220,10 @@ type TPAction struct { Weight float64 // Action's weight } -type TPActionTimings struct { +type TPActionPlan struct { TPid string // Tariff plan id - ActionTimingsId string // ActionTimings id - ActionTimings []*TPActionTiming // Set of ActionTiming bindings this profile will group + Id string // ActionPlan id + ActionPlan []*TPActionTiming // Set of ActionTiming bindings this profile will group } type TPActionTiming struct { @@ -266,7 +266,7 @@ type TPAccountActions struct { Tenant string // Tenant's Id Account string // Account name Direction string // Traffic direction - ActionTimingsId string // Id of ActionTimings profile to use + ActionPlanId string // Id of ActionPlan profile to use ActionTriggersId string // Id of ActionTriggers profile to use } diff --git a/utils/consts.go b/utils/consts.go index b91f0d7aa..3a6135335 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -27,7 +27,7 @@ const ( TBL_TP_RATING_PLANS = "tp_rating_plans" TBL_TP_RATE_PROFILES = "tp_rating_profiles" TBL_TP_ACTIONS = "tp_actions" - TBL_TP_ACTION_TIMINGS = "tp_action_timings" + TBL_TP_ACTION_PLANS = "tp_action_plans" TBL_TP_ACTION_TRIGGERS = "tp_action_triggers" TBL_TP_ACCOUNT_ACTIONS = "tp_account_actions" TBL_CDRS_PRIMARY = "cdrs_primary" @@ -41,7 +41,7 @@ const ( RATING_PLANS_CSV = "RatingPlans.csv" RATING_PROFILES_CSV = "RatingProfiles.csv" ACTIONS_CSV = "Actions.csv" - ACTION_TIMINGS_CSV = "ActionTimings.csv" + ACTION_PLANS_CSV = "ActionPlans.csv" ACTION_TRIGGERS_CSV = "ActionTriggers.csv" ACCOUNT_ACTIONS_CSV = "AccountActions.csv" TIMINGS_NRCOLS = 6 @@ -51,7 +51,7 @@ const ( DESTRATE_TIMINGS_NRCOLS = 4 RATE_PROFILES_NRCOLS = 7 ACTIONS_NRCOLS = 11 - ACTION_TIMINGS_NRCOLS = 4 + ACTION_PLANS_NRCOLS = 4 ACTION_TRIGGERS_NRCOLS = 8 ACCOUNT_ACTIONS_NRCOLS = 5 ROUNDING_UP = "*up"