mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-16 05:39:54 +05:00
RatingProfiles.csv: removing direction and cdrStatQueueIDs
This commit is contained in:
@@ -392,7 +392,8 @@ func (self *ApierV1) SetRatingProfile(attrs utils.AttrSetRatingProfile, reply *s
|
||||
return fmt.Errorf("%s:RatingPlanActivation:%v", utils.ErrMandatoryIeMissing.Error(), missing)
|
||||
}
|
||||
}
|
||||
tpRpf := utils.TPRatingProfile{Tenant: attrs.Tenant, Category: attrs.Category, Direction: attrs.Direction, Subject: attrs.Subject}
|
||||
tpRpf := utils.TPRatingProfile{Tenant: attrs.Tenant,
|
||||
Category: attrs.Category, Subject: attrs.Subject}
|
||||
keyId := tpRpf.KeyId()
|
||||
var rpfl *engine.RatingProfile
|
||||
if !attrs.Overwrite {
|
||||
@@ -419,8 +420,8 @@ func (self *ApierV1) SetRatingProfile(attrs utils.AttrSetRatingProfile, reply *s
|
||||
&engine.RatingPlanActivation{
|
||||
ActivationTime: at,
|
||||
RatingPlanId: ra.RatingPlanId,
|
||||
FallbackKeys: utils.FallbackSubjKeys(tpRpf.Direction,
|
||||
tpRpf.Tenant, tpRpf.Category, ra.FallbackSubjects)})
|
||||
FallbackKeys: utils.FallbackSubjKeys(tpRpf.Tenant,
|
||||
tpRpf.Category, ra.FallbackSubjects)})
|
||||
}
|
||||
if err := self.DataManager.SetRatingProfile(rpfl, utils.NonTransactional); err != nil {
|
||||
return utils.NewErrServerError(err)
|
||||
|
||||
@@ -67,12 +67,12 @@ func (self *ApierV1) GetTPRatingProfileLoadIds(attrs utils.AttrTPRatingProfileId
|
||||
if missing := utils.MissingStructFields(&attrs, []string{"TPid"}); len(missing) != 0 { //Params missing
|
||||
return utils.NewErrMandatoryIeMissing(missing...)
|
||||
}
|
||||
if ids, err := self.StorDb.GetTpTableIds(attrs.TPid, utils.TBLTPRateProfiles, utils.TPDistinctIds{"loadid"}, map[string]string{
|
||||
"tenant": attrs.Tenant,
|
||||
"category": attrs.Category,
|
||||
"direction": attrs.Direction,
|
||||
"subject": attrs.Subject,
|
||||
}, new(utils.Paginator)); err != nil {
|
||||
if ids, err := self.StorDb.GetTpTableIds(attrs.TPid, utils.TBLTPRateProfiles,
|
||||
utils.TPDistinctIds{"loadid"}, map[string]string{
|
||||
"tenant": attrs.Tenant,
|
||||
"category": attrs.Category,
|
||||
"subject": attrs.Subject,
|
||||
}, new(utils.Paginator)); err != nil {
|
||||
if err.Error() != utils.ErrNotFound.Error() {
|
||||
err = utils.NewErrServerError(err)
|
||||
}
|
||||
@@ -118,7 +118,9 @@ func (self *ApierV1) GetTPRatingProfileIds(attrs AttrGetTPRatingProfileIds, repl
|
||||
if missing := utils.MissingStructFields(&attrs, []string{"TPid"}); len(missing) != 0 { //Params missing
|
||||
return utils.NewErrMandatoryIeMissing(missing...)
|
||||
}
|
||||
if ids, err := self.StorDb.GetTpTableIds(attrs.TPid, utils.TBLTPRateProfiles, utils.TPDistinctIds{"loadid", "direction", "tenant", "category", "subject"}, nil, &attrs.Paginator); err != nil {
|
||||
if ids, err := self.StorDb.GetTpTableIds(attrs.TPid, utils.TBLTPRateProfiles,
|
||||
utils.TPDistinctIds{"loadid", "direction", "tenant", "category", "subject"},
|
||||
nil, &attrs.Paginator); err != nil {
|
||||
if err.Error() != utils.ErrNotFound.Error() {
|
||||
err = utils.NewErrServerError(err)
|
||||
}
|
||||
@@ -138,7 +140,10 @@ func (self *ApierV1) RemTPRatingProfile(attrs AttrGetTPRatingProfile, reply *str
|
||||
if err := tmpRpf.SetRatingProfileId(attrs.RatingProfileId); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := self.StorDb.RemTpData(utils.TBLTPRateProfiles, attrs.TPid, map[string]string{"loadid": tmpRpf.Loadid, "direction": tmpRpf.Direction, "tenant": tmpRpf.Tenant, "category": tmpRpf.Category, "subject": tmpRpf.Subject}); err != nil {
|
||||
if err := self.StorDb.RemTpData(utils.TBLTPRateProfiles,
|
||||
attrs.TPid, map[string]string{"loadid": tmpRpf.Loadid,
|
||||
"tenant": tmpRpf.Tenant, "category": tmpRpf.Category,
|
||||
"subject": tmpRpf.Subject}); err != nil {
|
||||
return utils.NewErrServerError(err)
|
||||
} else {
|
||||
*reply = utils.OK
|
||||
|
||||
@@ -106,19 +106,17 @@ CREATE TABLE `tp_rating_profiles` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`tpid` varchar(64) NOT NULL,
|
||||
`loadid` varchar(64) NOT NULL,
|
||||
`direction` varchar(8) NOT NULL,
|
||||
`tenant` varchar(64) NOT NULL,
|
||||
`category` varchar(32) NOT NULL,
|
||||
`subject` varchar(64) NOT NULL,
|
||||
`activation_time` varchar(26) NOT NULL,
|
||||
`rating_plan_tag` varchar(64) NOT NULL,
|
||||
`fallback_subjects` varchar(64),
|
||||
`cdr_stat_queue_ids` varchar(64),
|
||||
`created_at` TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `tpid` (`tpid`),
|
||||
KEY `tpid_loadid` (`tpid`, `loadid`),
|
||||
UNIQUE KEY `tpid_loadid_tenant_category_dir_subj_atime` (`tpid`,`loadid`, `tenant`,`category`,`direction`,`subject`,`activation_time`)
|
||||
UNIQUE KEY `tpid_loadid_tenant_category_dir_subj_atime` (`tpid`,`loadid`, `tenant`,`category`,`subject`,`activation_time`)
|
||||
);
|
||||
|
||||
--
|
||||
|
||||
@@ -102,19 +102,17 @@ CREATE TABLE tp_rating_profiles (
|
||||
id SERIAL PRIMARY KEY,
|
||||
tpid VARCHAR(64) NOT NULL,
|
||||
loadid VARCHAR(64) NOT NULL,
|
||||
direction VARCHAR(8) NOT NULL,
|
||||
tenant VARCHAR(64) NOT NULL,
|
||||
category VARCHAR(32) NOT NULL,
|
||||
subject VARCHAR(64) NOT NULL,
|
||||
activation_time VARCHAR(26) NOT NULL,
|
||||
rating_plan_tag VARCHAR(64) NOT NULL,
|
||||
fallback_subjects VARCHAR(64),
|
||||
cdr_stat_queue_ids VARCHAR(64),
|
||||
created_at TIMESTAMP WITH TIME ZONE,
|
||||
UNIQUE (tpid, loadid, tenant, category, direction, subject, activation_time)
|
||||
);
|
||||
CREATE INDEX tpratingprofiles_tpid_idx ON tp_rating_profiles (tpid);
|
||||
CREATE INDEX tpratingprofiles_idx ON tp_rating_profiles (tpid,loadid,direction,tenant,category,subject);
|
||||
CREATE INDEX tpratingprofiles_idx ON tp_rating_profiles (tpid,loadid,tenant,category,subject);
|
||||
|
||||
--
|
||||
-- Table structure for table `tp_shared_groups`
|
||||
|
||||
@@ -124,33 +124,33 @@ ANY_PLAN,DATA_RATE,*any,10
|
||||
DY_PLAN,RT_DY,*any,10
|
||||
`
|
||||
ratingProfiles = `
|
||||
*out,CUSTOMER_1,0,rif:from:tm,2012-01-01T00:00:00Z,PREMIUM,danb,
|
||||
*out,CUSTOMER_1,0,rif:from:tm,2012-02-28T00:00:00Z,STANDARD,danb,
|
||||
*out,CUSTOMER_2,0,danb:87.139.12.167,2012-01-01T00:00:00Z,STANDARD,danb,
|
||||
*out,CUSTOMER_1,0,danb,2012-01-01T00:00:00Z,PREMIUM,,
|
||||
*out,vdf,0,rif,2012-01-01T00:00:00Z,EVENING,,
|
||||
*out,vdf,call,rif,2012-02-28T00:00:00Z,EVENING,,
|
||||
*out,vdf,call,dan,2012-01-01T00:00:00Z,EVENING,,
|
||||
*out,vdf,0,minu,2012-01-01T00:00:00Z,EVENING,,
|
||||
*out,vdf,0,*any,2012-02-28T00:00:00Z,EVENING,,
|
||||
*out,vdf,0,one,2012-02-28T00:00:00Z,STANDARD,,
|
||||
*out,vdf,0,inf,2012-02-28T00:00:00Z,STANDARD,inf,
|
||||
*out,vdf,0,fall,2012-02-28T00:00:00Z,PREMIUM,rif,
|
||||
*out,test,0,trp,2013-10-01T00:00:00Z,TDRT,rif;danb,
|
||||
*out,vdf,0,fallback1,2013-11-18T13:45:00Z,G,fallback2,
|
||||
*out,vdf,0,fallback1,2013-11-18T13:46:00Z,G,fallback2,
|
||||
*out,vdf,0,fallback1,2013-11-18T13:47:00Z,G,fallback2,
|
||||
*out,vdf,0,fallback2,2013-11-18T13:45:00Z,R,rif,
|
||||
*out,cgrates.org,call,*any,2013-01-06T00:00:00Z,RP_UK,,
|
||||
*out,cgrates.org,call,discounted_minutes,2013-01-06T00:00:00Z,RP_UK_Mobile_BIG5_PKG,,
|
||||
*out,cgrates.org,data,rif,2013-01-06T00:00:00Z,RP_DATA,,
|
||||
*out,cgrates.org,call,max,2013-03-23T00:00:00Z,RP_MX,,
|
||||
*out,cgrates.org,call,nt,2012-02-28T00:00:00Z,GER_ONLY,,
|
||||
*in,cgrates.org,LCR_STANDARD,max,2013-03-23T00:00:00Z,RP_MX,,
|
||||
*out,cgrates.org,call,money,2015-02-28T00:00:00Z,EVENING,,
|
||||
*out,cgrates.org,call,dy,2015-02-28T00:00:00Z,DY_PLAN,,
|
||||
*out,cgrates.org,call,block,2015-02-28T00:00:00Z,DY_PLAN,,
|
||||
*out,cgrates.org,call,round,2016-06-30T00:00:00Z,DEFAULT,,
|
||||
CUSTOMER_1,0,rif:from:tm,2012-01-01T00:00:00Z,PREMIUM,danb
|
||||
CUSTOMER_1,0,rif:from:tm,2012-02-28T00:00:00Z,STANDARD,danb
|
||||
CUSTOMER_2,0,danb:87.139.12.167,2012-01-01T00:00:00Z,STANDARD,danb
|
||||
CUSTOMER_1,0,danb,2012-01-01T00:00:00Z,PREMIUM,
|
||||
vdf,0,rif,2012-01-01T00:00:00Z,EVENING,
|
||||
vdf,call,rif,2012-02-28T00:00:00Z,EVENING,
|
||||
vdf,call,dan,2012-01-01T00:00:00Z,EVENING,
|
||||
vdf,0,minu,2012-01-01T00:00:00Z,EVENING,
|
||||
vdf,0,*any,2012-02-28T00:00:00Z,EVENING,
|
||||
vdf,0,one,2012-02-28T00:00:00Z,STANDARD,
|
||||
vdf,0,inf,2012-02-28T00:00:00Z,STANDARD,inf
|
||||
vdf,0,fall,2012-02-28T00:00:00Z,PREMIUM,rif
|
||||
test,0,trp,2013-10-01T00:00:00Z,TDRT,rif;danb
|
||||
vdf,0,fallback1,2013-11-18T13:45:00Z,G,fallback2
|
||||
vdf,0,fallback1,2013-11-18T13:46:00Z,G,fallback2
|
||||
vdf,0,fallback1,2013-11-18T13:47:00Z,G,fallback2
|
||||
vdf,0,fallback2,2013-11-18T13:45:00Z,R,rif
|
||||
cgrates.org,call,*any,2013-01-06T00:00:00Z,RP_UK,
|
||||
cgrates.org,call,discounted_minutes,2013-01-06T00:00:00Z,RP_UK_Mobile_BIG5_PKG,
|
||||
cgrates.org,data,rif,2013-01-06T00:00:00Z,RP_DATA,
|
||||
cgrates.org,call,max,2013-03-23T00:00:00Z,RP_MX,
|
||||
cgrates.org,call,nt,2012-02-28T00:00:00Z,GER_ONLY,
|
||||
cgrates.org,LCR_STANDARD,max,2013-03-23T00:00:00Z,RP_MX,
|
||||
cgrates.org,call,money,2015-02-28T00:00:00Z,EVENING,
|
||||
cgrates.org,call,dy,2015-02-28T00:00:00Z,DY_PLAN,
|
||||
cgrates.org,call,block,2015-02-28T00:00:00Z,DY_PLAN,
|
||||
cgrates.org,call,round,2016-06-30T00:00:00Z,DEFAULT,
|
||||
`
|
||||
sharedGroups = `
|
||||
SG1,*any,*lowest,
|
||||
@@ -899,12 +899,12 @@ func TestLoadRatingProfiles(t *testing.T) {
|
||||
rp := csvr.ratingProfiles["*out:test:0:trp"]
|
||||
expected := &RatingProfile{
|
||||
Id: "*out:test:0:trp",
|
||||
RatingPlanActivations: RatingPlanActivations{&RatingPlanActivation{
|
||||
ActivationTime: time.Date(2013, 10, 1, 0, 0, 0, 0, time.UTC),
|
||||
RatingPlanId: "TDRT",
|
||||
FallbackKeys: []string{"*out:test:0:danb", "*out:test:0:rif"},
|
||||
CdrStatQueueIds: []string{""},
|
||||
}},
|
||||
RatingPlanActivations: RatingPlanActivations{
|
||||
&RatingPlanActivation{
|
||||
ActivationTime: time.Date(2013, 10, 1, 0, 0, 0, 0, time.UTC),
|
||||
RatingPlanId: "TDRT",
|
||||
FallbackKeys: []string{"*out:test:0:danb", "*out:test:0:rif"},
|
||||
}},
|
||||
}
|
||||
if !reflect.DeepEqual(rp, expected) {
|
||||
t.Errorf("Error loading rating profile: %+v", rp.RatingPlanActivations[0])
|
||||
|
||||
@@ -599,18 +599,16 @@ func (tps TpRatingProfiles) AsMapTPRatingProfiles() (map[string]*utils.TPRatingP
|
||||
result := make(map[string]*utils.TPRatingProfile)
|
||||
for _, tp := range tps {
|
||||
rp := &utils.TPRatingProfile{
|
||||
TPid: tp.Tpid,
|
||||
LoadId: tp.Loadid,
|
||||
Direction: tp.Direction,
|
||||
Tenant: tp.Tenant,
|
||||
Category: tp.Category,
|
||||
Subject: tp.Subject,
|
||||
TPid: tp.Tpid,
|
||||
LoadId: tp.Loadid,
|
||||
Tenant: tp.Tenant,
|
||||
Category: tp.Category,
|
||||
Subject: tp.Subject,
|
||||
}
|
||||
ra := &utils.TPRatingActivation{
|
||||
ActivationTime: tp.ActivationTime,
|
||||
RatingPlanId: tp.RatingPlanTag,
|
||||
FallbackSubjects: tp.FallbackSubjects,
|
||||
CdrStatQueueIds: tp.CdrStatQueueIds,
|
||||
}
|
||||
if existing, exists := result[rp.KeyIdA()]; !exists {
|
||||
rp.RatingPlanActivations = []*utils.TPRatingActivation{ra}
|
||||
@@ -651,24 +649,21 @@ func APItoModelRatingProfile(rp *utils.TPRatingProfile) (result TpRatingProfiles
|
||||
result = append(result, TpRatingProfile{
|
||||
Tpid: rp.TPid,
|
||||
Loadid: rp.LoadId,
|
||||
Direction: rp.Direction,
|
||||
Tenant: rp.Tenant,
|
||||
Category: rp.Category,
|
||||
Subject: rp.Subject,
|
||||
ActivationTime: rpa.ActivationTime,
|
||||
RatingPlanTag: rpa.RatingPlanId,
|
||||
FallbackSubjects: rpa.FallbackSubjects,
|
||||
CdrStatQueueIds: rpa.CdrStatQueueIds,
|
||||
})
|
||||
}
|
||||
if len(rp.RatingPlanActivations) == 0 {
|
||||
result = append(result, TpRatingProfile{
|
||||
Tpid: rp.TPid,
|
||||
Loadid: rp.LoadId,
|
||||
Direction: rp.Direction,
|
||||
Tenant: rp.Tenant,
|
||||
Category: rp.Category,
|
||||
Subject: rp.Subject,
|
||||
Tpid: rp.TPid,
|
||||
Loadid: rp.LoadId,
|
||||
Tenant: rp.Tenant,
|
||||
Category: rp.Category,
|
||||
Subject: rp.Subject,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -296,12 +296,11 @@ func TestTPRatingPlanAsExportSlice(t *testing.T) {
|
||||
|
||||
func TestTPRatingProfileAsExportSlice(t *testing.T) {
|
||||
tpRpf := &utils.TPRatingProfile{
|
||||
TPid: "TEST_TPID",
|
||||
LoadId: "TEST_LOADID",
|
||||
Direction: utils.OUT,
|
||||
Tenant: "cgrates.org",
|
||||
Category: "call",
|
||||
Subject: "*any",
|
||||
TPid: "TEST_TPID",
|
||||
LoadId: "TEST_LOADID",
|
||||
Tenant: "cgrates.org",
|
||||
Category: "call",
|
||||
Subject: "*any",
|
||||
RatingPlanActivations: []*utils.TPRatingActivation{
|
||||
&utils.TPRatingActivation{
|
||||
ActivationTime: "2014-01-14T00:00:00Z",
|
||||
@@ -314,8 +313,8 @@ func TestTPRatingProfileAsExportSlice(t *testing.T) {
|
||||
},
|
||||
}
|
||||
expectedSlc := [][]string{
|
||||
[]string{utils.OUT, "cgrates.org", "call", "*any", "2014-01-14T00:00:00Z", "TEST_RPLAN1", "subj1;subj2", ""},
|
||||
[]string{utils.OUT, "cgrates.org", "call", "*any", "2014-01-15T00:00:00Z", "TEST_RPLAN2", "subj1;subj2", ""},
|
||||
[]string{"cgrates.org", "call", "*any", "2014-01-14T00:00:00Z", "TEST_RPLAN1", "subj1;subj2"},
|
||||
[]string{"cgrates.org", "call", "*any", "2014-01-15T00:00:00Z", "TEST_RPLAN2", "subj1;subj2"},
|
||||
}
|
||||
|
||||
ms := APItoModelRatingProfile(tpRpf)
|
||||
|
||||
@@ -88,14 +88,12 @@ type TpRatingProfile struct {
|
||||
Id int64
|
||||
Tpid string
|
||||
Loadid string
|
||||
Direction string `index:"0" re:"\*out\s*"`
|
||||
Tenant string `index:"1" re:"[0-9A-Za-z_\.]+\s*"`
|
||||
Category string `index:"2" re:"\w+\s*"`
|
||||
Subject string `index:"3" re:"\*any\s*|(\w+;?)+\s*"`
|
||||
ActivationTime string `index:"4" re:"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z"`
|
||||
RatingPlanTag string `index:"5" re:"\w+\s*"`
|
||||
FallbackSubjects string `index:"6" re:"\w+\s*"`
|
||||
CdrStatQueueIds string `index:"7" re:"\w+\s*"`
|
||||
Tenant string `index:"0" re:"[0-9A-Za-z_\.]+\s*"`
|
||||
Category string `index:"1" re:"\w+\s*"`
|
||||
Subject string `index:"2" re:"\*any\s*|(\w+;?)+\s*"`
|
||||
ActivationTime string `index:"3" re:"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z"`
|
||||
RatingPlanTag string `index:"4" re:"\w+\s*"`
|
||||
FallbackSubjects string `index:"5" re:"\w+\s*"`
|
||||
CreatedAt time.Time
|
||||
}
|
||||
|
||||
@@ -105,7 +103,6 @@ func (rpf *TpRatingProfile) SetRatingProfileId(id string) error {
|
||||
return fmt.Errorf("Wrong TP Rating Profile Id: %s", id)
|
||||
}
|
||||
rpf.Loadid = ids[0]
|
||||
rpf.Direction = ids[1]
|
||||
rpf.Tenant = ids[2]
|
||||
rpf.Category = ids[3]
|
||||
rpf.Subject = ids[4]
|
||||
@@ -113,7 +110,8 @@ func (rpf *TpRatingProfile) SetRatingProfileId(id string) error {
|
||||
}
|
||||
|
||||
func (rpf *TpRatingProfile) GetRatingProfileId() string {
|
||||
return utils.ConcatenatedKey(rpf.Loadid, rpf.Direction, rpf.Tenant, rpf.Category, rpf.Subject)
|
||||
return utils.ConcatenatedKey(rpf.Loadid, utils.META_OUT,
|
||||
rpf.Tenant, rpf.Category, rpf.Subject)
|
||||
}
|
||||
|
||||
type TpAction struct {
|
||||
|
||||
@@ -34,14 +34,14 @@ type RatingProfile struct {
|
||||
}
|
||||
|
||||
type RatingPlanActivation struct {
|
||||
ActivationTime time.Time
|
||||
RatingPlanId string
|
||||
FallbackKeys []string
|
||||
CdrStatQueueIds []string
|
||||
ActivationTime time.Time
|
||||
RatingPlanId string
|
||||
FallbackKeys []string
|
||||
}
|
||||
|
||||
func (rpa *RatingPlanActivation) Equal(orpa *RatingPlanActivation) bool {
|
||||
return rpa.ActivationTime == orpa.ActivationTime && rpa.RatingPlanId == orpa.RatingPlanId
|
||||
return rpa.ActivationTime == orpa.ActivationTime &&
|
||||
rpa.RatingPlanId == orpa.RatingPlanId
|
||||
}
|
||||
|
||||
type RatingPlanActivations []*RatingPlanActivation
|
||||
|
||||
@@ -313,9 +313,6 @@ func (ms *MongoStorage) GetTPRatingPlans(tpid, id string, pag *utils.Paginator)
|
||||
|
||||
func (ms *MongoStorage) GetTPRatingProfiles(tp *utils.TPRatingProfile) ([]*utils.TPRatingProfile, error) {
|
||||
filter := bson.M{"tpid": tp.TPid}
|
||||
if tp.Direction != "" {
|
||||
filter["direction"] = tp.Direction
|
||||
}
|
||||
if tp.Tenant != "" {
|
||||
filter["tenant"] = tp.Tenant
|
||||
}
|
||||
@@ -829,12 +826,11 @@ func (ms *MongoStorage) SetTPRatingProfiles(tps []*utils.TPRatingProfile) error
|
||||
return ms.client.UseSession(ms.ctx, func(sctx mongo.SessionContext) (err error) {
|
||||
for _, tp := range tps {
|
||||
_, err = ms.getCol(utils.TBLTPRateProfiles).UpdateOne(sctx, bson.M{
|
||||
"tpid": tp.TPid,
|
||||
"loadid": tp.LoadId,
|
||||
"direction": tp.Direction,
|
||||
"tenant": tp.Tenant,
|
||||
"category": tp.Category,
|
||||
"subject": tp.Subject,
|
||||
"tpid": tp.TPid,
|
||||
"loadid": tp.LoadId,
|
||||
"tenant": tp.Tenant,
|
||||
"category": tp.Category,
|
||||
"subject": tp.Subject,
|
||||
}, bson.M{"$set": tp}, options.Update().SetUpsert(true))
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -389,7 +389,9 @@ func (self *SQLStorage) SetTPRatingProfiles(rpfs []*utils.TPRatingProfile) error
|
||||
}
|
||||
tx := self.db.Begin()
|
||||
for _, rpf := range rpfs {
|
||||
if err := tx.Where(&TpRatingProfile{Tpid: rpf.TPid, Loadid: rpf.LoadId, Direction: rpf.Direction, Tenant: rpf.Tenant, Category: rpf.Category, Subject: rpf.Subject}).Delete(TpRatingProfile{}).Error; err != nil {
|
||||
if err := tx.Where(&TpRatingProfile{Tpid: rpf.TPid, Loadid: rpf.LoadId,
|
||||
Tenant: rpf.Tenant, Category: rpf.Category,
|
||||
Subject: rpf.Subject}).Delete(TpRatingProfile{}).Error; err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
@@ -1226,9 +1228,6 @@ func (self *SQLStorage) GetTPRatingProfiles(filter *utils.TPRatingProfile) ([]*u
|
||||
if len(filter.LoadId) != 0 {
|
||||
q = q.Where("loadid = ?", filter.LoadId)
|
||||
}
|
||||
if len(filter.Direction) != 0 {
|
||||
q = q.Where("direction = ?", filter.Direction)
|
||||
}
|
||||
if len(filter.Tenant) != 0 {
|
||||
q = q.Where("tenant = ?", filter.Tenant)
|
||||
}
|
||||
|
||||
@@ -398,10 +398,10 @@ func (tpr *TpReader) LoadRatingProfilesFiltered(qriedRpf *utils.TPRatingProfile)
|
||||
}
|
||||
resultRatingProfile.RatingPlanActivations = append(resultRatingProfile.RatingPlanActivations,
|
||||
&RatingPlanActivation{
|
||||
ActivationTime: at,
|
||||
RatingPlanId: tpRa.RatingPlanId,
|
||||
FallbackKeys: utils.FallbackSubjKeys(tpRpf.Direction, tpRpf.Tenant, tpRpf.Category, tpRa.FallbackSubjects),
|
||||
CdrStatQueueIds: strings.Split(tpRa.CdrStatQueueIds, utils.INFIELD_SEP),
|
||||
ActivationTime: at,
|
||||
RatingPlanId: tpRa.RatingPlanId,
|
||||
FallbackKeys: utils.FallbackSubjKeys(tpRpf.Tenant,
|
||||
tpRpf.Category, tpRa.FallbackSubjects),
|
||||
})
|
||||
}
|
||||
if err := tpr.dm.SetRatingProfile(resultRatingProfile, utils.NonTransactional); err != nil {
|
||||
@@ -438,10 +438,10 @@ func (tpr *TpReader) LoadRatingProfiles() (err error) {
|
||||
}
|
||||
rpf.RatingPlanActivations = append(rpf.RatingPlanActivations,
|
||||
&RatingPlanActivation{
|
||||
ActivationTime: at,
|
||||
RatingPlanId: tpRa.RatingPlanId,
|
||||
FallbackKeys: utils.FallbackSubjKeys(tpRpf.Direction, tpRpf.Tenant, tpRpf.Category, tpRa.FallbackSubjects),
|
||||
CdrStatQueueIds: strings.Split(tpRa.CdrStatQueueIds, utils.INFIELD_SEP),
|
||||
ActivationTime: at,
|
||||
RatingPlanId: tpRa.RatingPlanId,
|
||||
FallbackKeys: utils.FallbackSubjKeys(tpRpf.Tenant,
|
||||
tpRpf.Category, tpRa.FallbackSubjects),
|
||||
})
|
||||
}
|
||||
tpr.ratingProfiles[tpRpf.KeyId()] = rpf
|
||||
|
||||
@@ -47,9 +47,9 @@ func TestAuthLoadCsv(t *testing.T) {
|
||||
DR_ANY_1CNT,*any,RT_1CENTWITHCF,*up,8,,`
|
||||
ratingPlans := `RP_1,DR_GERMANY,*any,10
|
||||
RP_ANY,DR_ANY_1CNT,*any,10`
|
||||
ratingProfiles := `*out,cgrates.org,call,testauthpostpaid1,2013-01-06T00:00:00Z,RP_1,,
|
||||
*out,cgrates.org,call,testauthpostpaid2,2013-01-06T00:00:00Z,RP_1,*any,
|
||||
*out,cgrates.org,call,*any,2013-01-06T00:00:00Z,RP_ANY,,`
|
||||
ratingProfiles := `cgrates.org,call,testauthpostpaid1,2013-01-06T00:00:00Z,RP_1,
|
||||
cgrates.org,call,testauthpostpaid2,2013-01-06T00:00:00Z,RP_1,*any
|
||||
cgrates.org,call,*any,2013-01-06T00:00:00Z,RP_ANY,`
|
||||
sharedGroups := ``
|
||||
actions := `TOPUP10_AC,*topup_reset,,,,*monetary,*out,,*any,,,*unlimited,,0,10,false,false,10`
|
||||
actionPlans := `TOPUP10_AT,TOPUP10_AC,*asap,10`
|
||||
|
||||
@@ -47,9 +47,9 @@ DR_SMS_1,*any,RT_SMS_5c,*up,4,0,`
|
||||
ratingPlans := `RP_RETAIL,DR_RETAIL,ALWAYS,10
|
||||
RP_DATA1,DR_DATA_1,ALWAYS,10
|
||||
RP_SMS1,DR_SMS_1,ALWAYS,10`
|
||||
ratingProfiles := `*out,cgrates.org,call,*any,2012-01-01T00:00:00Z,RP_RETAIL,,
|
||||
*out,cgrates.org,data,*any,2012-01-01T00:00:00Z,RP_DATA1,,
|
||||
*out,cgrates.org,sms,*any,2012-01-01T00:00:00Z,RP_SMS1,,`
|
||||
ratingProfiles := `cgrates.org,call,*any,2012-01-01T00:00:00Z,RP_RETAIL,
|
||||
cgrates.org,data,*any,2012-01-01T00:00:00Z,RP_DATA1,
|
||||
cgrates.org,sms,*any,2012-01-01T00:00:00Z,RP_SMS1,`
|
||||
csvr := engine.NewTpReader(dataDB.DataDB(), engine.NewStringCSVStorage(',', dests, timings, rates, destinationRates, ratingPlans, ratingProfiles,
|
||||
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), "", "")
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ RT_DATA_1c,0,0.001,10,10,0`
|
||||
DR_DATA_2,*any,RT_DATA_1c,*up,4,0,`
|
||||
ratingPlans := `RP_DATA1,DR_DATA_1,TM1,10
|
||||
RP_DATA1,DR_DATA_2,TM2,10`
|
||||
ratingProfiles := `*out,cgrates.org,data,*any,2012-01-01T00:00:00Z,RP_DATA1,,`
|
||||
ratingProfiles := `cgrates.org,data,*any,2012-01-01T00:00:00Z,RP_DATA1,`
|
||||
csvr := engine.NewTpReader(dataDB.DataDB(), engine.NewStringCSVStorage(',', "", timings, rates, destinationRates, ratingPlans, ratingProfiles,
|
||||
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), "", "")
|
||||
if err := csvr.LoadTimings(); err != nil {
|
||||
|
||||
@@ -45,8 +45,8 @@ RT_UK_Mobile_BIG5,0.01,0.10,1s,1s,0s`
|
||||
DR_UK_Mobile_BIG5,DST_UK_Mobile_BIG5,RT_UK_Mobile_BIG5,*up,8,0,`
|
||||
ratingPlans := `RP_UK_Mobile_BIG5_PKG,DR_UK_Mobile_BIG5_PKG,ALWAYS,10
|
||||
RP_UK,DR_UK_Mobile_BIG5,ALWAYS,10`
|
||||
ratingProfiles := `*out,cgrates.org,call,*any,2013-01-06T00:00:00Z,RP_UK,,
|
||||
*out,cgrates.org,call,discounted_minutes,2013-01-06T00:00:00Z,RP_UK_Mobile_BIG5_PKG,,`
|
||||
ratingProfiles := `cgrates.org,call,*any,2013-01-06T00:00:00Z,RP_UK,
|
||||
cgrates.org,call,discounted_minutes,2013-01-06T00:00:00Z,RP_UK_Mobile_BIG5_PKG,`
|
||||
sharedGroups := ``
|
||||
actions := `TOPUP10_AC,*topup_reset,,,,*monetary,*out,,*any,,,*unlimited,,10,10,false,false,10
|
||||
TOPUP10_AC1,*topup_reset,,,,*voice,*out,,DST_UK_Mobile_BIG5,discounted_minutes,,*unlimited,,40000000000,10,false,false,10`
|
||||
|
||||
@@ -45,8 +45,8 @@ RT_UK_Mobile_BIG5,0.01,0.10,1s,1s,0s`
|
||||
DR_UK_Mobile_BIG5,DST_UK_Mobile_BIG5,RT_UK_Mobile_BIG5,*up,8,0,`
|
||||
ratingPlans := `RP_UK_Mobile_BIG5_PKG,DR_UK_Mobile_BIG5_PKG,ALWAYS,10
|
||||
RP_UK,DR_UK_Mobile_BIG5,ALWAYS,10`
|
||||
ratingProfiles := `*out,cgrates.org,call,*any,2013-01-06T00:00:00Z,RP_UK,,
|
||||
*out,cgrates.org,call,discounted_minutes,2013-01-06T00:00:00Z,RP_UK_Mobile_BIG5_PKG,,`
|
||||
ratingProfiles := `cgrates.org,call,*any,2013-01-06T00:00:00Z,RP_UK,
|
||||
cgrates.org,call,discounted_minutes,2013-01-06T00:00:00Z,RP_UK_Mobile_BIG5_PKG,`
|
||||
sharedGroups := ``
|
||||
actions := `TOPUP10_AC,*topup_reset,,,,*monetary,*out,,*any,,,*unlimited,,0,10,false,false,10
|
||||
TOPUP10_AC1,*topup_reset,,,,*voice,*out,,DST_UK_Mobile_BIG5,discounted_minutes,,*unlimited,,40s,10,false,false,10`
|
||||
|
||||
@@ -45,8 +45,8 @@ RT_UK_Mobile_BIG5,0.01,0.10,1s,1s,0s`
|
||||
DR_UK_Mobile_BIG5,DST_UK_Mobile_BIG5,RT_UK_Mobile_BIG5,*up,8,0,`
|
||||
ratingPlans := `RP_UK_Mobile_BIG5_PKG,DR_UK_Mobile_BIG5_PKG,ALWAYS,10
|
||||
RP_UK,DR_UK_Mobile_BIG5,ALWAYS,10`
|
||||
ratingProfiles := `*out,cgrates.org,call,*any,2013-01-06T00:00:00Z,RP_UK,,
|
||||
*out,cgrates.org,call,discounted_minutes,2013-01-06T00:00:00Z,RP_UK_Mobile_BIG5_PKG,,`
|
||||
ratingProfiles := `cgrates.org,call,*any,2013-01-06T00:00:00Z,RP_UK,
|
||||
cgrates.org,call,discounted_minutes,2013-01-06T00:00:00Z,RP_UK_Mobile_BIG5_PKG,`
|
||||
sharedGroups := ``
|
||||
actions := `TOPUP10_AC1,*topup_reset,,,,*voice,*out,,DST_UK_Mobile_BIG5,discounted_minutes,,*unlimited,,40s,10,false,false,10`
|
||||
actionPlans := `TOPUP10_AT,TOPUP10_AC1,ASAP,10`
|
||||
|
||||
@@ -38,7 +38,7 @@ func TestSMSLoadCsvTpSmsChrg1(t *testing.T) {
|
||||
rates := `RT_SMS_5c,0,0.005,1,1,0`
|
||||
destinationRates := `DR_SMS_1,*any,RT_SMS_5c,*up,4,0,`
|
||||
ratingPlans := `RP_SMS1,DR_SMS_1,ALWAYS,10`
|
||||
ratingProfiles := `*out,cgrates.org,sms,*any,2012-01-01T00:00:00Z,RP_SMS1,,`
|
||||
ratingProfiles := `cgrates.org,sms,*any,2012-01-01T00:00:00Z,RP_SMS1,`
|
||||
csvr := engine.NewTpReader(dataDB.DataDB(), engine.NewStringCSVStorage(',', "", timings, rates, destinationRates, ratingPlans, ratingProfiles,
|
||||
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), "", "")
|
||||
if err := csvr.LoadTimings(); err != nil {
|
||||
|
||||
@@ -43,8 +43,10 @@ func (m *Migrator) migrateCurrentTPratingprofiles() (err error) {
|
||||
return err
|
||||
}
|
||||
for _, ratPrf := range ratingProfile {
|
||||
if err := m.storDBIn.StorDB().RemTpData(utils.TBLTPRateProfiles, ratPrf.TPid, map[string]string{"loadid": ratPrf.LoadId,
|
||||
"direction": ratPrf.Direction, "tenant": ratPrf.Tenant, "category": ratPrf.Category, "subject": ratPrf.Subject}); err != nil {
|
||||
if err := m.storDBIn.StorDB().RemTpData(utils.TBLTPRateProfiles, ratPrf.TPid,
|
||||
map[string]string{"loadid": ratPrf.LoadId,
|
||||
"tenant": ratPrf.Tenant, "category": ratPrf.Category,
|
||||
"subject": ratPrf.Subject}); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -215,13 +215,12 @@ func NewTPRatingProfileFromKeyId(tpid, loadId, keyId string) (*TPRatingProfile,
|
||||
if len(s) != 4 {
|
||||
return nil, fmt.Errorf("Cannot parse key %s into RatingProfile", keyId)
|
||||
}
|
||||
return &TPRatingProfile{TPid: tpid, LoadId: loadId, Tenant: s[1], Category: s[2], Direction: s[0], Subject: s[3]}, nil
|
||||
return &TPRatingProfile{TPid: tpid, LoadId: loadId, Tenant: s[1], Category: s[2], Subject: s[3]}, nil
|
||||
}
|
||||
|
||||
type TPRatingProfile struct {
|
||||
TPid string // Tariff plan id
|
||||
LoadId string // Gives ability to load specific RatingProfile based on load identifier, hence being able to keep history also in stordb
|
||||
Direction string // Traffic direction, OUT is the only one supported for now
|
||||
Tenant string // Tenant's Id
|
||||
Category string // TypeOfRecord
|
||||
Subject string // Rating subject, usually the same as account
|
||||
@@ -230,15 +229,15 @@ type TPRatingProfile struct {
|
||||
|
||||
// Used as key in nosql db (eg: redis)
|
||||
func (self *TPRatingProfile) KeyId() string {
|
||||
return fmt.Sprintf("%s:%s:%s:%s", self.Direction, self.Tenant, self.Category, self.Subject)
|
||||
return fmt.Sprintf("%s:%s:%s:%s", META_OUT, self.Tenant, self.Category, self.Subject)
|
||||
}
|
||||
|
||||
func (self *TPRatingProfile) KeyIdA() string {
|
||||
return fmt.Sprintf("%s:%s:%s:%s:%s", self.LoadId, self.Direction, self.Tenant, self.Category, self.Subject)
|
||||
return fmt.Sprintf("%s:%s:%s:%s:%s", self.LoadId, META_OUT, self.Tenant, self.Category, self.Subject)
|
||||
}
|
||||
|
||||
func (rpf *TPRatingProfile) GetRatingProfilesId() string {
|
||||
return fmt.Sprintf("%s%s%s%s%s%s%s%s%s", rpf.LoadId, CONCATENATED_KEY_SEP, rpf.Direction, CONCATENATED_KEY_SEP, rpf.Tenant, CONCATENATED_KEY_SEP, rpf.Category, CONCATENATED_KEY_SEP, rpf.Subject)
|
||||
return fmt.Sprintf("%s%s%s%s%s%s%s%s%s", rpf.LoadId, CONCATENATED_KEY_SEP, META_OUT, CONCATENATED_KEY_SEP, rpf.Tenant, CONCATENATED_KEY_SEP, rpf.Category, CONCATENATED_KEY_SEP, rpf.Subject)
|
||||
}
|
||||
|
||||
func (rpf *TPRatingProfile) SetRatingProfilesId(id string) error {
|
||||
@@ -247,7 +246,6 @@ func (rpf *TPRatingProfile) SetRatingProfilesId(id string) error {
|
||||
return fmt.Errorf("Wrong TPRatingProfileId: %s", id)
|
||||
}
|
||||
rpf.LoadId = ids[0]
|
||||
rpf.Direction = ids[1]
|
||||
rpf.Tenant = ids[2]
|
||||
rpf.Category = ids[3]
|
||||
rpf.Subject = ids[4]
|
||||
@@ -257,36 +255,33 @@ func (rpf *TPRatingProfile) SetRatingProfilesId(id string) error {
|
||||
type AttrSetRatingProfile struct {
|
||||
Tenant string // Tenant's Id
|
||||
Category string // TypeOfRecord
|
||||
Direction string // Traffic direction, OUT is the only one supported for now
|
||||
Subject string // Rating subject, usually the same as account
|
||||
Overwrite bool // Overwrite if exists
|
||||
RatingPlanActivations []*TPRatingActivation // Activate rating plans at specific time
|
||||
}
|
||||
|
||||
type AttrGetRatingProfile struct {
|
||||
Tenant string // Tenant's Id
|
||||
Category string // TypeOfRecord
|
||||
Direction string // Traffic direction, OUT is the only one supported for now
|
||||
Subject string // Rating subject, usually the same as account
|
||||
Tenant string // Tenant's Id
|
||||
Category string // TypeOfRecord
|
||||
Subject string // Rating subject, usually the same as account
|
||||
}
|
||||
|
||||
func (self *AttrGetRatingProfile) GetID() string {
|
||||
return ConcatenatedKey(self.Direction, self.Tenant, self.Category, self.Subject)
|
||||
return ConcatenatedKey(META_OUT, self.Tenant, self.Category, self.Subject)
|
||||
}
|
||||
|
||||
type TPRatingActivation struct {
|
||||
ActivationTime string // Time when this profile will become active, defined as unix epoch time
|
||||
RatingPlanId string // Id of RatingPlan profile
|
||||
FallbackSubjects string // So we follow the api
|
||||
CdrStatQueueIds string
|
||||
}
|
||||
|
||||
// Helper to return the subject fallback keys we need in dataDb
|
||||
func FallbackSubjKeys(direction, tenant, tor, fallbackSubjects string) []string {
|
||||
func FallbackSubjKeys(tenant, tor, fallbackSubjects string) []string {
|
||||
var sslice sort.StringSlice
|
||||
if len(fallbackSubjects) != 0 {
|
||||
for _, fbs := range strings.Split(fallbackSubjects, string(FALLBACK_SEP)) {
|
||||
newKey := fmt.Sprintf("%s:%s:%s:%s", direction, tenant, tor, fbs)
|
||||
newKey := fmt.Sprintf("%s:%s:%s:%s", META_OUT, tenant, tor, fbs)
|
||||
i := sslice.Search(newKey)
|
||||
if i < len(sslice) && sslice[i] != newKey {
|
||||
// not found so insert it
|
||||
@@ -311,11 +306,10 @@ type AttrSetDestination struct { //ToDo
|
||||
}
|
||||
|
||||
type AttrTPRatingProfileIds struct {
|
||||
TPid string // Tariff plan id
|
||||
Tenant string // Tenant's Id
|
||||
Category string // TypeOfRecord
|
||||
Direction string // Traffic direction
|
||||
Subject string // Rating subject, usually the same as account
|
||||
TPid string // Tariff plan id
|
||||
Tenant string // Tenant's Id
|
||||
Category string // TypeOfRecord
|
||||
Subject string // Rating subject, usually the same as account
|
||||
}
|
||||
|
||||
type TPActions struct {
|
||||
|
||||
Reference in New Issue
Block a user