mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
<RateS> RatingProfile fallback functionality
This commit is contained in:
@@ -140,20 +140,31 @@ func (rS *RateS) V1CostForEvent(ctx *context.Context, args *utils.CGREvent, rpCo
|
||||
config.RatesProfileIgnoreFiltersDftOpt, utils.MetaProfileIgnoreFilters); err != nil {
|
||||
return
|
||||
}
|
||||
var rtPrl *utils.RateProfile
|
||||
if rtPrl, err = rS.matchingRateProfileForEvent(ctx, args.Tenant, rPfIDs, args, ignFilters); err != nil {
|
||||
if err != utils.ErrNotFound {
|
||||
err = utils.NewErrServerError(err)
|
||||
ignoredRPfIDs := utils.NewStringSet([]string{})
|
||||
var firstError error
|
||||
for i := 0; i < rS.cfg.RateSCfg().Verbosity; i++ {
|
||||
var rtPrl *utils.RateProfile
|
||||
if rtPrl, err = rS.matchingRateProfileForEvent(ctx, args.Tenant, rPfIDs, args, ignFilters, ignoredRPfIDs); err != nil {
|
||||
if err != utils.ErrNotFound {
|
||||
err = utils.NewErrServerError(err)
|
||||
} else if i != 0 { // no more fallback rating profiles, return the original error
|
||||
err = utils.NewErrServerError(firstError)
|
||||
}
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
var rcvCost *utils.RateProfileCost
|
||||
if rcvCost, err = rS.rateProfileCostForEvent(ctx, rtPrl, args, rS.cfg.RateSCfg().Verbosity); err != nil {
|
||||
if err != utils.ErrNotFound {
|
||||
err = utils.NewErrServerError(err)
|
||||
var rcvCost *utils.RateProfileCost
|
||||
if rcvCost, err = rS.rateProfileCostForEvent(ctx, rtPrl, args, rS.cfg.RateSCfg().Verbosity); err != nil {
|
||||
if err != utils.ErrNotFound {
|
||||
//err = utils.NewErrServerError(err)
|
||||
if i == 0 {
|
||||
firstError = err
|
||||
}
|
||||
ignoredRPfIDs.Add(rtPrl.ID)
|
||||
continue // no cost, go to the next matching RatingProfile
|
||||
}
|
||||
return
|
||||
}
|
||||
return
|
||||
*rpCost = *rcvCost
|
||||
}
|
||||
*rpCost = *rcvCost
|
||||
return
|
||||
}
|
||||
|
||||
@@ -67,7 +67,8 @@ func (rS *RateS) Shutdown() (err error) {
|
||||
}
|
||||
|
||||
// matchingRateProfileForEvent returns the matched RateProfile for the given event
|
||||
func (rS *RateS) matchingRateProfileForEvent(ctx *context.Context, tnt string, rPfIDs []string, args *utils.CGREvent, ignoreFilters bool) (rtPfl *utils.RateProfile, err error) {
|
||||
func (rS *RateS) matchingRateProfileForEvent(ctx *context.Context, tnt string, rPfIDs []string, args *utils.CGREvent,
|
||||
ignoreFilters bool, ignoredRPfIDs utils.StringSet) (rtPfl *utils.RateProfile, err error) {
|
||||
evNm := utils.MapStorage{
|
||||
utils.MetaReq: args.Event,
|
||||
utils.MetaOpts: args.APIOpts,
|
||||
@@ -94,6 +95,9 @@ func (rS *RateS) matchingRateProfileForEvent(ctx *context.Context, tnt string, r
|
||||
}
|
||||
var rpWw *rpWithWeight
|
||||
for _, rPfID := range rPfIDs {
|
||||
if ignoredRPfIDs.Has(rPfID) { // already processed and gave errors or not appropriate for our request
|
||||
continue
|
||||
}
|
||||
var rPf *utils.RateProfile
|
||||
if rPf, err = rS.dm.GetRateProfile(ctx, tnt, rPfID,
|
||||
true, true, utils.NonTransactional); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user