From 1f4191d89d7e748d3b9e58731abaa8820007192a Mon Sep 17 00:00:00 2001 From: DanB Date: Mon, 27 Sep 2021 19:51:32 +0200 Subject: [PATCH] Adding AccountS support for cost calculation of routes --- engine/route_cost_sort.go | 47 +++++++++++++++++++++++++++++---------- sessions/sessions.go | 2 +- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/engine/route_cost_sort.go b/engine/route_cost_sort.go index 61edf4fab..087ef9552 100644 --- a/engine/route_cost_sort.go +++ b/engine/route_cost_sort.go @@ -51,22 +51,45 @@ func populateCostForRoutes(ctx *context.Context, cfg *config.CGRConfig, }, RouteParameters: route.RouteParameters, } - ev.APIOpts[utils.OptsRatesRateProfileIDs] = utils.CloneStringSlice(route.RateProfileIDs) - var rpCost utils.RateProfileCost - if err = connMgr.Call(ctx, cfg.RouteSCfg().RateSConns, - utils.RateSv1CostForEvent, ev, &rpCost); err != nil { - if extraOpts.ignoreErrors { - utils.Logger.Warning( - fmt.Sprintf("<%s> ignoring route with ID: %s, err: %s", - utils.RouteS, route.ID, err.Error())) - continue + var cost float64 + if len(route.AccountIDs) != 0 { // query AccountS for cost + + acntCost := new(utils.ExtEventCharges) + ev.APIOpts[utils.OptsAccountsAccountIDs] = utils.CloneStringSlice(route.AccountIDs) + if err = connMgr.Call(ctx, cfg.RouteSCfg().AccountSConns, + utils.AccountSv1MaxAbstracts, ev, &acntCost); err != nil { + return } - return + + cost = *acntCost.Concretes + acntIDs := make([]string, 0, len(acntCost.Accounts)) + for acntID := range acntCost.Accounts { + acntIDs = append(acntIDs, acntID) + } + srtRoute.SortingData[utils.AccountIDs] = acntIDs + + } else { // query RateS for cost + + ev.APIOpts[utils.OptsRatesRateProfileIDs] = utils.CloneStringSlice(route.RateProfileIDs) + var rpCost utils.RateProfileCost + if err = connMgr.Call(ctx, cfg.RouteSCfg().RateSConns, + utils.RateSv1CostForEvent, ev, &rpCost); err != nil { + if extraOpts.ignoreErrors { + utils.Logger.Warning( + fmt.Sprintf("<%s> ignoring route with ID: %s, err: %s", + utils.RouteS, route.ID, err.Error())) + continue + } + return + } + cost, _ = rpCost.Cost.Float64() + srtRoute.SortingData[utils.RatingPlanID] = rpCost.ID + } - cost, _ := rpCost.Cost.Float64() + srtRoute.sortingDataF64[utils.Cost] = cost srtRoute.SortingData[utils.Cost] = cost - srtRoute.SortingData[utils.RatingPlanID] = rpCost.ID + var pass bool if pass, err = routeLazyPass(ctx, route.lazyCheckRules, ev, srtRoute.SortingData, cfg.FilterSCfg().ResourceSConns, diff --git a/sessions/sessions.go b/sessions/sessions.go index e1822f0b5..f9b25dffe 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -1438,7 +1438,7 @@ func (sS *SessionS) accounSMaxAbstracts(ctx *context.Context, cgrEvs map[string] for runID, cgrEv := range cgrEvs { acntCost := new(utils.ExtEventCharges) if err = sS.connMgr.Call(ctx, sS.cgrCfg.SessionSCfg().AttributeSConns, // Fix Here with AccountS - utils.AccountSv1DebitAbstracts, cgrEv, &acntCost); err != nil { + utils.AccountSv1MaxAbstracts, cgrEv, &acntCost); err != nil { return } maxAbstracts[runID] = utils.NewDecimalFromFloat64(*acntCost.Abstracts) // did not optimize here since we need to remove floats from acntCost