diff --git a/config/cdrscfg.go b/config/cdrscfg.go index 1d3d218f0..3fdd6f385 100644 --- a/config/cdrscfg.go +++ b/config/cdrscfg.go @@ -33,6 +33,7 @@ const ( CDRsRatesDftOpt = false CDRsStatsDftOpt = false CDRsThresholdsDftOpt = false + CDRsRefundDftOpt = false CDRsRerateDftOpt = false CDRsStoreDftOpt = true ) @@ -45,6 +46,7 @@ type CdrsOpts struct { Rates []*utils.DynamicBoolOpt Stats []*utils.DynamicBoolOpt Thresholds []*utils.DynamicBoolOpt + Refund []*utils.DynamicBoolOpt Rerate []*utils.DynamicBoolOpt Store []*utils.DynamicBoolOpt } @@ -100,12 +102,15 @@ func (cdrsOpts *CdrsOpts) loadFromJSONCfg(jsnCfg *CdrsOptsJson) { if jsnCfg.Thresholds != nil { cdrsOpts.Thresholds = append(cdrsOpts.Thresholds, jsnCfg.Thresholds...) } - if jsnCfg.Store != nil { - cdrsOpts.Store = append(cdrsOpts.Store, jsnCfg.Store...) + if jsnCfg.Refund != nil { + cdrsOpts.Refund = append(cdrsOpts.Refund, jsnCfg.Refund...) } if jsnCfg.Rerate != nil { cdrsOpts.Rerate = append(cdrsOpts.Rerate, jsnCfg.Rerate...) } + if jsnCfg.Store != nil { + cdrsOpts.Store = append(cdrsOpts.Store, jsnCfg.Store...) + } } // loadFromJSONCfg loads Cdrs config from JsonCfg @@ -167,6 +172,7 @@ func (cdrscfg CdrsCfg) AsMapInterface(string) any { utils.MetaRates: cdrscfg.Opts.Rates, utils.MetaStats: cdrscfg.Opts.Stats, utils.MetaThresholds: cdrscfg.Opts.Thresholds, + utils.MetaRefund: cdrscfg.Opts.Refund, utils.MetaRerate: cdrscfg.Opts.Rerate, utils.MetaStore: cdrscfg.Opts.Store, } @@ -237,6 +243,10 @@ func (cdrsOpts *CdrsOpts) Clone() *CdrsOpts { if cdrsOpts.Thresholds != nil { thdS = utils.CloneDynamicBoolOpt(cdrsOpts.Thresholds) } + var refund []*utils.DynamicBoolOpt + if cdrsOpts.Refund != nil { + refund = utils.CloneDynamicBoolOpt(cdrsOpts.Refund) + } var rerate []*utils.DynamicBoolOpt if cdrsOpts.Rerate != nil { rerate = utils.CloneDynamicBoolOpt(cdrsOpts.Rerate) @@ -253,6 +263,7 @@ func (cdrsOpts *CdrsOpts) Clone() *CdrsOpts { Rates: rtS, Stats: stS, Thresholds: thdS, + Refund: refund, Rerate: rerate, Store: store, } @@ -305,6 +316,7 @@ type CdrsOptsJson struct { Rates []*utils.DynamicBoolOpt `json:"*rates"` Stats []*utils.DynamicBoolOpt `json:"*stats"` Thresholds []*utils.DynamicBoolOpt `json:"*thresholds"` + Refund []*utils.DynamicBoolOpt `json:"*refund"` Rerate []*utils.DynamicBoolOpt `json:"*rerate"` Store []*utils.DynamicBoolOpt `json:"*store"` } @@ -351,6 +363,9 @@ func diffCdrsOptsJsonCfg(d *CdrsOptsJson, v1, v2 *CdrsOpts) *CdrsOptsJson { if !utils.DynamicBoolOptEqual(v1.Thresholds, v2.Thresholds) { d.Thresholds = v2.Thresholds } + if !utils.DynamicBoolOptEqual(v1.Refund, v2.Refund) { + d.Refund = v2.Refund + } if !utils.DynamicBoolOptEqual(v1.Rerate, v2.Rerate) { d.Rerate = v2.Rerate } diff --git a/config/cdrscfg_test.go b/config/cdrscfg_test.go index 8b0962774..b97b1884f 100644 --- a/config/cdrscfg_test.go +++ b/config/cdrscfg_test.go @@ -60,6 +60,7 @@ func TestCdrsCfgloadFromJsonCfg(t *testing.T) { Rates: []*utils.DynamicBoolOpt{}, Stats: []*utils.DynamicBoolOpt{}, Thresholds: []*utils.DynamicBoolOpt{}, + Refund: []*utils.DynamicBoolOpt{}, Rerate: []*utils.DynamicBoolOpt{}, Store: []*utils.DynamicBoolOpt{}, }, @@ -209,6 +210,7 @@ func TestCdrsCfgAsMapInterface(t *testing.T) { utils.MetaRates: []*utils.DynamicBoolOpt{}, utils.MetaStats: []*utils.DynamicBoolOpt{}, utils.MetaThresholds: []*utils.DynamicBoolOpt{}, + utils.MetaRefund: []*utils.DynamicBoolOpt{}, utils.MetaRerate: []*utils.DynamicBoolOpt{}, utils.MetaStore: []*utils.DynamicBoolOpt{}, }, @@ -250,6 +252,7 @@ func TestCdrsCfgAsMapInterface2(t *testing.T) { utils.MetaRates: []*utils.DynamicBoolOpt{}, utils.MetaStats: []*utils.DynamicBoolOpt{}, utils.MetaThresholds: []*utils.DynamicBoolOpt{}, + utils.MetaRefund: []*utils.DynamicBoolOpt{}, utils.MetaRerate: []*utils.DynamicBoolOpt{}, utils.MetaStore: []*utils.DynamicBoolOpt{}, }, diff --git a/config/config.go b/config/config.go index 5ce4043fd..c82038704 100644 --- a/config/config.go +++ b/config/config.go @@ -130,6 +130,7 @@ func newCGRConfig(config []byte) (cfg *CGRConfig, err error) { Rates: []*utils.DynamicBoolOpt{}, Stats: []*utils.DynamicBoolOpt{}, Thresholds: []*utils.DynamicBoolOpt{}, + Refund: []*utils.DynamicBoolOpt{}, Rerate: []*utils.DynamicBoolOpt{}, Store: []*utils.DynamicBoolOpt{}, }}, diff --git a/config/config_defaults.go b/config/config_defaults.go index a1ea234f0..d27e6edf1 100644 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -369,6 +369,13 @@ const CGRATES_CFG_JSON = ` // "Value": false, // }, // ], + // "*refund": [ + // { + // "Tenant": "*any", + // "FilterIDs": [], + // "Value": false, + // }, + // ], // "*rerate": [ // { // "Tenant": "*any", diff --git a/config/config_test.go b/config/config_test.go index d44989f76..024ad9a42 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -332,6 +332,7 @@ func TestCgrCfgJSONDefaultsCDRS(t *testing.T) { Rates: []*utils.DynamicBoolOpt{}, Stats: []*utils.DynamicBoolOpt{}, Thresholds: []*utils.DynamicBoolOpt{}, + Refund: []*utils.DynamicBoolOpt{}, Rerate: []*utils.DynamicBoolOpt{}, Store: []*utils.DynamicBoolOpt{}, }, @@ -3986,6 +3987,7 @@ func TestV1GetConfigCdrs(t *testing.T) { utils.MetaRates: []*utils.DynamicBoolOpt{}, utils.MetaStats: []*utils.DynamicBoolOpt{}, utils.MetaThresholds: []*utils.DynamicBoolOpt{}, + utils.MetaRefund: []*utils.DynamicBoolOpt{}, utils.MetaRerate: []*utils.DynamicBoolOpt{}, utils.MetaStore: []*utils.DynamicBoolOpt{}, }, @@ -5086,7 +5088,7 @@ func TestV1GetConfigAsJSONFilterS(t *testing.T) { func TestV1GetConfigAsJSONCdrs(t *testing.T) { var reply string - expected := `{"cdrs":{"accounts_conns":[],"actions_conns":[],"attributes_conns":[],"chargers_conns":[],"ees_conns":[],"enabled":false,"extra_fields":[],"online_cdr_exports":null,"opts":{"*accounts":[],"*attributes":[],"*chargers":[],"*ees":[],"*rates":[],"*rerate":[],"*stats":[],"*store":[],"*thresholds":[]},"rates_conns":[],"session_cost_retries":5,"stats_conns":[],"thresholds_conns":[]}}` + expected := `{"cdrs":{"accounts_conns":[],"actions_conns":[],"attributes_conns":[],"chargers_conns":[],"ees_conns":[],"enabled":false,"extra_fields":[],"online_cdr_exports":null,"opts":{"*accounts":[],"*attributes":[],"*chargers":[],"*ees":[],"*rates":[],"*refund":[],"*rerate":[],"*stats":[],"*store":[],"*thresholds":[]},"rates_conns":[],"session_cost_retries":5,"stats_conns":[],"thresholds_conns":[]}}` cfgCgr := NewDefaultCGRConfig() if err := cfgCgr.V1GetConfigAsJSON(context.Background(), &SectionWithAPIOpts{Sections: []string{CDRsJSON}}, &reply); err != nil { t.Error(err)