diff --git a/engine/loader_csv_test.go b/engine/loader_csv_test.go index f58949e2e..be896b177 100755 --- a/engine/loader_csv_test.go +++ b/engine/loader_csv_test.go @@ -293,6 +293,9 @@ cgrates.org,FLTR_DST_NL,*destinations,Destination,DST_NL,2014-07-29T15:00:00Z sppProfiles = ` #Tenant,ID,FilterIDs,ActivationInterval,Sorting,SortingParams,SupplierID,SupplierFilterIDs,SupplierRatingPlanIDs,SupplierResourceIDs,SupplierStatIDs,SupplierWeight,Blocker,Weight cgrates.org,SPP_1,FLTR_ACNT_dan;FLTR_DST_DE,2014-07-29T15:00:00Z,*lowest_cost,,supplier1,FLTR_ACNT_dan,RPL_1,ResGroup1,Stat1,10,true,20 +cgrates.org,SPP_1,,,,,supplier1,,RPL_2,ResGroup2,,10,, +cgrates.org,SPP_1,,,,,supplier1,FLTR_DST_DE,RPL_3,ResGroup3,Stat2,10,, +cgrates.org,SPP_1,,,,,supplier1,,,ResGroup4,Stat3,10,, ` ) @@ -1633,10 +1636,10 @@ func TestLoadSupplierProfiles(t *testing.T) { Suppliers: []*utils.TPRequestSupplier{ &utils.TPRequestSupplier{ ID: "supplier1", - FilterIDs: []string{"FLTR_ACNT_dan"}, - RatingPlanIDs: []string{"RPL_1"}, - ResourceIDs: []string{"ResGroup1"}, - StatIDs: []string{"Stat1"}, + FilterIDs: []string{"FLTR_ACNT_dan", "FLTR_DST_DE"}, + RatingPlanIDs: []string{"RPL_1", "RPL_2", "RPL_3"}, + ResourceIDs: []string{"ResGroup1", "ResGroup2", "ResGroup3", "ResGroup4"}, + StatIDs: []string{"Stat1", "Stat2", "Stat3"}, Weight: 10, }, }, diff --git a/engine/model_helpers.go b/engine/model_helpers.go index 5df7759e4..552560762 100755 --- a/engine/model_helpers.go +++ b/engine/model_helpers.go @@ -2423,6 +2423,7 @@ type TpSuppliers []*TpSupplier func (tps TpSuppliers) AsTPSuppliers() (result []*utils.TPSupplier) { mst := make(map[string]*utils.TPSupplier) + suppliersMap := make(map[string]map[string]*utils.TPRequestSupplier) for _, tp := range tps { th, found := mst[tp.ID] if !found { @@ -2436,14 +2437,41 @@ func (tps TpSuppliers) AsTPSuppliers() (result []*utils.TPSupplier) { } } if tp.SupplierID != "" { - th.Suppliers = append(th.Suppliers, &utils.TPRequestSupplier{ - ID: tp.SupplierID, - FilterIDs: strings.Split(tp.SupplierFilterIDs, utils.INFIELD_SEP), - RatingPlanIDs: strings.Split(tp.SupplierRatingplanIDs, utils.INFIELD_SEP), - ResourceIDs: strings.Split(tp.SupplierResourceIDs, utils.INFIELD_SEP), - StatIDs: strings.Split(tp.SupplierStatIDs, utils.INFIELD_SEP), - Weight: tp.SupplierWeight, - }) + if _, has := suppliersMap[tp.ID]; !has { + suppliersMap[tp.ID] = make(map[string]*utils.TPRequestSupplier) + } + sup, found := suppliersMap[tp.ID][tp.SupplierID] + if !found { + sup = &utils.TPRequestSupplier{ + ID: tp.SupplierID, + Weight: tp.SupplierWeight, + } + } + if tp.SupplierFilterIDs != "" { + supFilterSplit := strings.Split(tp.SupplierFilterIDs, utils.INFIELD_SEP) + for _, supFilter := range supFilterSplit { + sup.FilterIDs = append(sup.FilterIDs, supFilter) + } + } + if tp.SupplierRatingplanIDs != "" { + ratingPlanSplit := strings.Split(tp.SupplierRatingplanIDs, utils.INFIELD_SEP) + for _, ratingSplit := range ratingPlanSplit { + sup.RatingPlanIDs = append(sup.RatingPlanIDs, ratingSplit) + } + } + if tp.SupplierResourceIDs != "" { + resSplit := strings.Split(tp.SupplierResourceIDs, utils.INFIELD_SEP) + for _, res := range resSplit { + sup.ResourceIDs = append(sup.ResourceIDs, res) + } + } + if tp.SupplierStatIDs != "" { + statSplit := strings.Split(tp.SupplierStatIDs, utils.INFIELD_SEP) + for _, sts := range statSplit { + sup.StatIDs = append(sup.StatIDs, sts) + } + } + suppliersMap[tp.ID][tp.SupplierID] = sup } if tp.SortingParams != "" { sortingParamSplit := strings.Split(tp.SortingParams, utils.INFIELD_SEP) @@ -2470,13 +2498,19 @@ func (tps TpSuppliers) AsTPSuppliers() (result []*utils.TPSupplier) { th.FilterIDs = append(th.FilterIDs, filter) } } - mst[tp.ID] = th } result = make([]*utils.TPSupplier, len(mst)) i := 0 for _, th := range mst { result[i] = th + for id, _ := range suppliersMap { + if result[i].ID == id { + for _, supdata := range suppliersMap[id] { + result[i].Suppliers = append(result[i].Suppliers, supdata) + } + } + } i++ } return