<RateS> RatingProfile fallback functionality

This commit is contained in:
DanB
2024-12-17 20:45:45 +01:00
parent f30c8681b1
commit 6a087122de
2 changed files with 28 additions and 13 deletions

View File

@@ -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
}

View File

@@ -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 {