mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-24 00:28:44 +05:00
Merge branch 'master' of https://github.com/cgrates/cgrates
This commit is contained in:
@@ -692,8 +692,8 @@ func (cd *CallDescriptor) GetLCR() (*LCRCost, error) {
|
||||
}
|
||||
for _, ts := range lcrCost.TimeSpans {
|
||||
if ts.Entry.Strategy == LCR_STRATEGY_STATIC {
|
||||
for _, supplier := range strings.Split(ts.Entry.Suppliers, ";") {
|
||||
supplier = strings.TrimSpace(supplier)
|
||||
for _, param := range strings.Split(ts.Entry.StrategyParams, ";") {
|
||||
supplier := strings.TrimSpace(param)
|
||||
lcrCD := cd.Clone()
|
||||
lcrCD.Subject = supplier
|
||||
if cc, err := lcrCD.GetCost(); err != nil || cc == nil {
|
||||
@@ -710,7 +710,7 @@ func (cd *CallDescriptor) GetLCR() (*LCRCost, error) {
|
||||
}
|
||||
} else {
|
||||
// find rating profiles
|
||||
ratingProfileSearchKey := fmt.Sprintf("%s:%s:%s:", lcr.Direction, lcr.Tenant, ts.Entry.Category)
|
||||
ratingProfileSearchKey := fmt.Sprintf("%s:%s:%s:", lcr.Direction, lcr.Tenant, ts.Entry.RPCategory)
|
||||
suppliers := cache2go.GetEntriesKeys(LCR_PREFIX + ratingProfileSearchKey)
|
||||
for _, supplier := range suppliers {
|
||||
split := strings.Split(supplier, ":")
|
||||
|
||||
@@ -19,7 +19,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
package engine
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
@@ -34,9 +33,11 @@ const (
|
||||
)
|
||||
|
||||
type LCR struct {
|
||||
Direction string
|
||||
Tenant string
|
||||
Customer string
|
||||
Category string
|
||||
Direction string
|
||||
Account string
|
||||
Subject string
|
||||
Activations []*LCRActivation
|
||||
}
|
||||
type LCRActivation struct {
|
||||
@@ -44,12 +45,12 @@ type LCRActivation struct {
|
||||
Entries []*LCREntry
|
||||
}
|
||||
type LCREntry struct {
|
||||
DestinationId string
|
||||
Category string
|
||||
Strategy string
|
||||
Suppliers string
|
||||
Weight float64
|
||||
precision int
|
||||
DestinationId string
|
||||
RPCategory string
|
||||
Strategy string
|
||||
StrategyParams string
|
||||
Weight float64
|
||||
precision int
|
||||
}
|
||||
|
||||
type LCRCost struct {
|
||||
@@ -69,7 +70,7 @@ type LCRSupplierCost struct {
|
||||
}
|
||||
|
||||
func (lcr *LCR) GetId() string {
|
||||
return fmt.Sprintf("%s:%s:%s", lcr.Direction, lcr.Tenant, lcr.Customer)
|
||||
return utils.ConcatenatedKey(lcr.Direction, lcr.Tenant, lcr.Category, lcr.Account, lcr.Subject)
|
||||
}
|
||||
|
||||
func (lcr *LCR) Len() int {
|
||||
|
||||
@@ -608,22 +608,24 @@ func (csvr *CSVReader) LoadLCRs() (err error) {
|
||||
defer fp.Close()
|
||||
}
|
||||
for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() {
|
||||
direction, tenant, customer := record[0], record[1], record[2]
|
||||
id := fmt.Sprintf("%s:%s:%s", direction, tenant, customer)
|
||||
tenant, category, direction, account, subject := record[0], record[1], record[2], record[3], record[4]
|
||||
id := utils.ConcatenatedKey(direction, tenant, category, account, subject)
|
||||
lcr, found := csvr.lcrs[id]
|
||||
activationTime, err := utils.ParseTimeDetectLayout(record[7])
|
||||
activationTime, err := utils.ParseTimeDetectLayout(record[9])
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not parse LCR activation time: %v", err)
|
||||
}
|
||||
weight, err := strconv.ParseFloat(record[8], 64)
|
||||
weight, err := strconv.ParseFloat(record[10], 64)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not parse LCR weight: %v", err)
|
||||
}
|
||||
if !found {
|
||||
lcr = &LCR{
|
||||
Direction: direction,
|
||||
Tenant: tenant,
|
||||
Customer: customer,
|
||||
Category: category,
|
||||
Direction: direction,
|
||||
Account: account,
|
||||
Subject: subject,
|
||||
}
|
||||
}
|
||||
var act *LCRActivation
|
||||
@@ -640,11 +642,11 @@ func (csvr *CSVReader) LoadLCRs() (err error) {
|
||||
lcr.Activations = append(lcr.Activations, act)
|
||||
}
|
||||
act.Entries = append(act.Entries, &LCREntry{
|
||||
DestinationId: record[3],
|
||||
Category: record[4],
|
||||
Strategy: record[5],
|
||||
Suppliers: record[6],
|
||||
Weight: weight,
|
||||
DestinationId: record[5],
|
||||
RPCategory: record[6],
|
||||
Strategy: record[7],
|
||||
StrategyParams: record[8],
|
||||
Weight: weight,
|
||||
})
|
||||
csvr.lcrs[id] = lcr
|
||||
}
|
||||
|
||||
@@ -141,10 +141,9 @@ SG3,*any,*lowest,
|
||||
`
|
||||
|
||||
lcrs = `
|
||||
*in,cgrates.org,*any,EU_LANDLINE,LCR_STANDARD,*static,ivo;dan;rif,2012-01-01T00:00:00Z,10
|
||||
*in,cgrates.org,*any,*any,LCR_STANDARD,*lowest_cost,,2012-01-01T00:00:00Z,20
|
||||
cgrates.org,call,*in,*any,*any,EU_LANDLINE,LCR_STANDARD,*static,ivo;dan;rif,2012-01-01T00:00:00Z,10
|
||||
cgrates.org,call,*in,*any,*any,*any,LCR_STANDARD,*lowest_cost,,2012-01-01T00:00:00Z,20
|
||||
`
|
||||
|
||||
actions = `
|
||||
MINI,*topup_reset,,,*monetary,*out,,,,,*unlimited,,10,10,10
|
||||
MINI,*topup,,,*voice,*out,,NAT,test,,*unlimited,,100,10,10
|
||||
@@ -809,35 +808,37 @@ func TestLoadLCRs(t *testing.T) {
|
||||
t.Error("Failed to load LCRs: ", csvr.lcrs)
|
||||
}
|
||||
|
||||
lcr := csvr.lcrs["*in:cgrates.org:*any"]
|
||||
lcr := csvr.lcrs["*in:cgrates.org:call:*any:*any"]
|
||||
expected := &LCR{
|
||||
Direction: "*in",
|
||||
Tenant: "cgrates.org",
|
||||
Customer: "*any",
|
||||
Category: "call",
|
||||
Direction: "*in",
|
||||
Account: "*any",
|
||||
Subject: "*any",
|
||||
Activations: []*LCRActivation{
|
||||
&LCRActivation{
|
||||
ActivationTime: time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
Entries: []*LCREntry{
|
||||
&LCREntry{
|
||||
DestinationId: "EU_LANDLINE",
|
||||
Category: "LCR_STANDARD",
|
||||
Strategy: "*static",
|
||||
Suppliers: "ivo;dan;rif",
|
||||
Weight: 10,
|
||||
DestinationId: "EU_LANDLINE",
|
||||
RPCategory: "LCR_STANDARD",
|
||||
Strategy: "*static",
|
||||
StrategyParams: "ivo;dan;rif",
|
||||
Weight: 10,
|
||||
},
|
||||
&LCREntry{
|
||||
DestinationId: "*any",
|
||||
Category: "LCR_STANDARD",
|
||||
Strategy: "*lowest_cost",
|
||||
Suppliers: "",
|
||||
Weight: 20,
|
||||
DestinationId: "*any",
|
||||
RPCategory: "LCR_STANDARD",
|
||||
Strategy: "*lowest_cost",
|
||||
StrategyParams: "",
|
||||
Weight: 20,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
if !reflect.DeepEqual(lcr, expected) {
|
||||
t.Errorf("Error loading lcr %+v: ", lcr.Activations)
|
||||
t.Errorf("Error loading lcr %+v: ", lcr)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -482,8 +482,8 @@ func (self *SQLStorage) SetTPLCRs(tpid string, lcrs map[string]*LCR) error {
|
||||
if i != 0 { //Consecutive values after the first will be prefixed with "," as separator
|
||||
buffer.WriteRune(',')
|
||||
}
|
||||
buffer.WriteString(fmt.Sprintf("('%s','%s','%s','%s','%s','%s','%s','%v','%v', '%v')",
|
||||
tpid, lcr.Direction, lcr.Tenant, lcr.Customer, entry.DestinationId, entry.Category, entry.Strategy, entry.Suppliers, act.ActivationTime, entry.Weight))
|
||||
buffer.WriteString(fmt.Sprintf("('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%v', '%v')",
|
||||
tpid, lcr.Tenant, lcr.Category, lcr.Direction, lcr.Account, lcr.Subject, entry.DestinationId, entry.RPCategory, entry.Strategy, entry.RPCategory, act.ActivationTime, entry.Weight))
|
||||
i++
|
||||
}
|
||||
}
|
||||
@@ -1379,19 +1379,21 @@ func (self *SQLStorage) GetTpLCRs(tpid, tag string) (map[string]*LCR, error) {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
var id int
|
||||
var tpid, direction, tenant, customer, destinationId, category, strategy, suppliers, activationTimeString string
|
||||
var tpid, tenant, category, direction, account, subject, destinationId, rpCategory, strategy, strategyParams, suppliers, activationTimeString string
|
||||
var weight float64
|
||||
if err := rows.Scan(&id, &tpid, &direction, &tenant, &customer, &destinationId, &category, &strategy, &suppliers, &activationTimeString, &weight); err != nil {
|
||||
if err := rows.Scan(&id, &tpid, &tenant, &category, &direction, &account, &subject, &destinationId, &rpCategory, &strategy, &strategyParams, &suppliers, &activationTimeString, &weight); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
tag := fmt.Sprintf("%s:%s:%s", direction, tenant, customer)
|
||||
tag := utils.ConcatenatedKey(direction, tenant, category, account, subject)
|
||||
lcr, found := lcrs[tag]
|
||||
activationTime, _ := utils.ParseTimeDetectLayout(activationTimeString)
|
||||
if !found {
|
||||
lcr = &LCR{
|
||||
Direction: direction,
|
||||
Tenant: tenant,
|
||||
Customer: customer,
|
||||
Category: category,
|
||||
Direction: direction,
|
||||
Account: account,
|
||||
Subject: subject,
|
||||
}
|
||||
}
|
||||
var act *LCRActivation
|
||||
@@ -1408,11 +1410,11 @@ func (self *SQLStorage) GetTpLCRs(tpid, tag string) (map[string]*LCR, error) {
|
||||
lcr.Activations = append(lcr.Activations, act)
|
||||
}
|
||||
act.Entries = append(act.Entries, &LCREntry{
|
||||
DestinationId: destinationId,
|
||||
Category: category,
|
||||
Strategy: strategy,
|
||||
Suppliers: suppliers,
|
||||
Weight: weight,
|
||||
DestinationId: destinationId,
|
||||
RPCategory: category,
|
||||
Strategy: strategy,
|
||||
StrategyParams: strategyParams,
|
||||
Weight: weight,
|
||||
})
|
||||
lcrs[tag] = lcr
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user