ActionTimings -> ActionPlan in APIs, storage tables and redis key

This commit is contained in:
DanB
2014-01-19 20:02:32 +01:00
parent 13707ca377
commit 0348be416c
31 changed files with 125 additions and 185 deletions

View File

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

View File

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

View File

@@ -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")
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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
1 #Tenant Account Direction ActionTimingsTag ActionTriggersTag
2 cgrates.org 1001 *out PREPAID_10 STANDARD_TRIGGERS
3 cgrates.org 1002 *out PREPAID_10 STANDARD_TRIGGERS
4 cgrates.org 1003 *out PREPAID_10 STANDARD_TRIGGERS
5 cgrates.org 1004 *out PREPAID_10 STANDARD_TRIGGERS
6 cgrates.org 1005 *out PREPAID_10 STANDARD_TRIGGERS

View File

@@ -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
1 #Tag BalanceType Direction ThresholdType ThresholdValue DestinationTag ActionsTag Weight
2 STANDARD_TRIGGERS *monetary *out *min_balance 2 LOG_BALANCE 10
3 STANDARD_TRIGGERS *monetary *out *max_balance 20 LOG_BALANCE 10
4 STANDARD_TRIGGERS *monetary *out *max_counter 15 FS_USERS LOG_BALANCE 10

View File

@@ -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
1 #ActionsTag Action BalanceType Direction Units ExpiryTime DestinationTag RatingSubject BalanceWeight ExtraParameters Weight
2 PREPAID_10 *topup_reset *monetary *out 10 *unlimited *any 10 10

View File

@@ -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
1 #Tag DestinationsTag RatesTag
2 DR_RETAIL_PEAK GERMANY LANDLINE_PEAK
3 DR_RETAIL_PEAK GERMANY_MOBILE MOBILE_PEAK
4 DR_RETAIL_OFFPEAK GERMANY LANDLINE_OFFPEAK
5 DR_RETAIL_OFFPEAK GERMANY_MOBILE MOBILE_OFFPEAK
6 DR_FREESWITCH_USERS FS_USERS RT_FS_USERS

View File

@@ -1,6 +0,0 @@
#Tag,Prefix
GERMANY,+49
GERMANY_MOBILE,+4915
GERMANY_MOBILE,+4916
GERMANY_MOBILE,+4917
FS_USERS,10
1 #Tag Prefix
2 GERMANY +49
3 GERMANY_MOBILE +4915
4 GERMANY_MOBILE +4916
5 GERMANY_MOBILE +4917
6 FS_USERS 10

View File

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

View File

@@ -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
1 #Tag ConnectFee Rate RateUnit RateIncrement GroupIntervalStart RoundingMethod RoundingDecimals
2 LANDLINE_PEAK 0.02 0.02 60s 60s 0s *up 4
3 LANDLINE_PEAK 0.02 0.01 1s 1s 60s *up 4
4 MOBILE_PEAK 0.02 0.14 60s 60s 0s *up 4
5 LANDLINE_OFFPEAK 1 0 60s 60s 0s *up 4
6 MOBILE_OFFPEAK 0.02 0.1 60s 60s 0 *up 4
7 RT_FS_USERS 0 0 60s 60s 0s *up 0

View File

@@ -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
1 #Tag DestinationRatesTag TimingTag Weight
2 RETAIL1 DR_RETAIL_PEAK PEAK 10
3 RETAIL1 DR_RETAIL_OFFPEAK OFFPEAK_MORNING 10
4 RETAIL1 DR_RETAIL_OFFPEAK OFFPEAK_EVENING 10
5 RETAIL1 DR_RETAIL_OFFPEAK WEEKEND 10
6 RETAIL1 DR_FREESWITCH_USERS ALWAYS 10

View File

@@ -1,2 +0,0 @@
#Tenant,TOR,Direction,Subject,ActivationTime,RatingPlanTag,FallbackSubject
cgrates.org,call,*out,*any,2012-01-01T00:00:00Z,RETAIL1,
1 #Tenant TOR Direction Subject ActivationTime RatingPlanTag FallbackSubject
2 cgrates.org call *out *any 2012-01-01T00:00:00Z RETAIL1

View File

@@ -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
1 #Tag Years Months MonthDays WeekDays Time
2 ALWAYS *any *any *any *any 00:00:00
3 ASAP *any *any *any *any *asap
4 OFFPEAK_MORNING *any *any *any 1;2;3;4;5 00:00:00
5 PEAK *any *any *any 1;2;3;4;5 08:00:00
6 OFFPEAK_EVENING *any *any *any 1;2;3;4;5 20:00:00
7 WEEKEND *any *any *any 6;7 00:00:00

View File

@@ -1,2 +0,0 @@
#Tag,ActionsTag,TimingTag,Weight
PREPAID_10,PREPAID_10,ASAP,10
1 #Tag ActionsTag TimingTag Weight
2 PREPAID_10 PREPAID_10 ASAP 10

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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