From bc5a80fe25c367c0ea1e48ad70d04f539c178f3b Mon Sep 17 00:00:00 2001 From: DanB Date: Sun, 15 Jun 2014 19:05:00 +0200 Subject: [PATCH] Adding *voice balance and derived charging inside fs_json tutorial, fixup loading of derived charging from csv --- apier/tutfsjson_local_test.go | 2 +- .../prepaid1centpsec/DerivedChargers.csv | 8 +++--- .../fs_json/cgrates/tariffplans/Actions.csv | 1 + .../cgrates/tariffplans/DerivedChargers.csv | 2 ++ .../cgrates/tariffplans/DestinationRates.csv | 1 + .../fs_json/cgrates/tariffplans/Rates.csv | 1 + .../cgrates/tariffplans/RatingPlans.csv | 1 + .../cgrates/tariffplans/RatingProfiles.csv | 1 + engine/loader_helpers.go | 4 +-- engine/loader_helpers_test.go | 26 +++++++++---------- mediator/mediator_local_test.go | 6 ++--- 11 files changed, 30 insertions(+), 23 deletions(-) create mode 100644 data/tutorials/fs_json/cgrates/tariffplans/DerivedChargers.csv diff --git a/apier/tutfsjson_local_test.go b/apier/tutfsjson_local_test.go index 721de1893..6694af96a 100644 --- a/apier/tutfsjson_local_test.go +++ b/apier/tutfsjson_local_test.go @@ -169,7 +169,7 @@ func TestFsJsonLoadTariffPlans(t *testing.T) { } time.Sleep(time.Duration(*waitRater) * time.Millisecond) // Give time for scheduler to execute topups var rcvStats *utils.CacheStats - expectedStats := &utils.CacheStats{Destinations: 3, RatingPlans: 2, RatingProfiles: 2, Actions: 5, SharedGroups: 1, RatingAliases: 1, AccountAliases: 1} + expectedStats := &utils.CacheStats{Destinations: 3, RatingPlans: 3, RatingProfiles: 3, Actions: 5, SharedGroups: 1, RatingAliases: 1, AccountAliases: 1, DerivedChargers: 1} var args utils.AttrCacheStats if err := rater.Call("ApierV1.GetCacheStats", args, &rcvStats); err != nil { t.Error("Got error on ApierV1.GetCacheStats: ", err.Error()) diff --git a/data/tariffplans/prepaid1centpsec/DerivedChargers.csv b/data/tariffplans/prepaid1centpsec/DerivedChargers.csv index 8439bdde8..4b02d8f0e 100644 --- a/data/tariffplans/prepaid1centpsec/DerivedChargers.csv +++ b/data/tariffplans/prepaid1centpsec/DerivedChargers.csv @@ -1,4 +1,4 @@ -#Tenant,Tor,Direction,Account,Subject,RunId,ReqTypeField,DirectionField,TenantField,TorField,AccountField,SubjectField,DestinationField,SetupTimeField,AnswerTimeField,DurationField -cgrates.org,call,*out,dan,dan,extra1,^prepaid,,,,^rif,^rif,,,,^1s -cgrates.org,call,*out,dan,dan,extra2,,,,,^ivo,^ivo,,,, -cgrates.org,call,*out,dan,*any,extra1,,,,,^rif2,^rif2,,,, +#Direction,Tenant,Tor,Account,Subject,RunId,ReqTypeField,DirectionField,TenantField,TorField,AccountField,SubjectField,DestinationField,SetupTimeField,AnswerTimeField,DurationField +*out,cgrates.org,call,dan,dan,extra1,^prepaid,,,,^rif,^rif,,,,^1s +*out,cgrates.org,call,dan,dan,extra2,,,,,^ivo,^ivo,,,, +*out,cgrates.org,call,dan,*any,extra1,,,,,^rif2,^rif2,,,, diff --git a/data/tutorials/fs_json/cgrates/tariffplans/Actions.csv b/data/tutorials/fs_json/cgrates/tariffplans/Actions.csv index 97b926ac6..e2153d6af 100644 --- a/data/tutorials/fs_json/cgrates/tariffplans/Actions.csv +++ b/data/tutorials/fs_json/cgrates/tariffplans/Actions.csv @@ -1,6 +1,7 @@ #ActionsTag,Action,BalanceType,Direction,Units,ExpiryTime,DestinationTag,RatingSubject,BalanceWeight,SharedGroup,ExtraParameters,Weight TOPUP_RST_10,*topup_reset,*monetary,*out,10,*unlimited,*any,,10,,,10 TOPUP_RST_5,*topup_reset,*monetary,*out,5,*unlimited,*any,,20,,,10 +TOPUP_RST_5,*topup_reset,*voice,*out,5,*unlimited,DST_1002,SPECIAL_1002,20,,,10 TOPUP_RST_SHARED_5,*topup,*monetary,*out,5,*unlimited,*any,,10,SHARED_A,,10 SHARED_A_0,*topup_reset,*monetary,*out,0,*unlimited,*any,,10,SHARED_A,,10 LOG_WARNING,*log,,,,,,,,,,10 diff --git a/data/tutorials/fs_json/cgrates/tariffplans/DerivedChargers.csv b/data/tutorials/fs_json/cgrates/tariffplans/DerivedChargers.csv new file mode 100644 index 000000000..3336198e4 --- /dev/null +++ b/data/tutorials/fs_json/cgrates/tariffplans/DerivedChargers.csv @@ -0,0 +1,2 @@ +#Direction,Tenant,Category,Account,Subject,RunId,ReqTypeField,DirectionField,TenantField,TorField,AccountField,SubjectField,DestinationField,SetupTimeField,AnswerTimeField,UsageField +*out,cgrates.org,call,1001,1001,fs_json_run,^rated,*default,*default,*default,1010,1010,*default,*default,*default,*default \ No newline at end of file diff --git a/data/tutorials/fs_json/cgrates/tariffplans/DestinationRates.csv b/data/tutorials/fs_json/cgrates/tariffplans/DestinationRates.csv index 03d4c30a8..b902c0601 100644 --- a/data/tutorials/fs_json/cgrates/tariffplans/DestinationRates.csv +++ b/data/tutorials/fs_json/cgrates/tariffplans/DestinationRates.csv @@ -5,3 +5,4 @@ DR_1003_20CNT,DST_1003,RT_40CNT,*up,4 DR_1003_10CNT,DST_1003,RT_10CNT,*up,4 DR_FS_40CNT,DST_FS,RT_40CNT,*up,4 DR_FS_10CNT,DST_FS,RT_10CNT,*up,4 +DR_SPECIAL_1002,DST_1002,RT_1CNT,*up,4 diff --git a/data/tutorials/fs_json/cgrates/tariffplans/Rates.csv b/data/tutorials/fs_json/cgrates/tariffplans/Rates.csv index ded15468d..5f571f24b 100644 --- a/data/tutorials/fs_json/cgrates/tariffplans/Rates.csv +++ b/data/tutorials/fs_json/cgrates/tariffplans/Rates.csv @@ -5,3 +5,4 @@ RT_20CNT,0.4,0.2,60s,60s,0s RT_20CNT,0,0.1,60s,1s,60s RT_40CNT,0.8,0.4,60s,30s,0s RT_40CNT,0,0.2,60s,10s,60s +RT_1CNT,0,0.01,60s,60s,0s diff --git a/data/tutorials/fs_json/cgrates/tariffplans/RatingPlans.csv b/data/tutorials/fs_json/cgrates/tariffplans/RatingPlans.csv index dde7f25bb..7eb4dc71d 100644 --- a/data/tutorials/fs_json/cgrates/tariffplans/RatingPlans.csv +++ b/data/tutorials/fs_json/cgrates/tariffplans/RatingPlans.csv @@ -15,3 +15,4 @@ RP_RETAIL2,DR_1003_10CNT,OFFPEAK_WEEKEND,10 RP_RETAIL2,DR_FS_10CNT,OFFPEAK_MORNING,10 RP_RETAIL2,DR_FS_10CNT,OFFPEAK_EVENING,10 RP_RETAIL2,DR_FS_10CNT,OFFPEAK_WEEKEND,10 +RP_SPECIAL_1002,DR_SPECIAL_1002,ALWAYS,10 diff --git a/data/tutorials/fs_json/cgrates/tariffplans/RatingProfiles.csv b/data/tutorials/fs_json/cgrates/tariffplans/RatingProfiles.csv index ad0062c82..367d42cfd 100644 --- a/data/tutorials/fs_json/cgrates/tariffplans/RatingProfiles.csv +++ b/data/tutorials/fs_json/cgrates/tariffplans/RatingProfiles.csv @@ -1,3 +1,4 @@ #Direction,Tenant,Category,Subject,ActivationTime,RatingPlanId,RatesFallbackSubject *out,cgrates.org,call,*any,2014-01-14T00:00:00Z,RP_RETAIL1, *out,cgrates.org,call,1001;1006,2014-01-14T00:00:00Z,RP_RETAIL2, +*out,cgrates.org,call,SPECIAL_1002,2014-01-14T00:00:00Z,RP_SPECIAL_1002, diff --git a/engine/loader_helpers.go b/engine/loader_helpers.go index 7f464a680..3b3b2fe44 100644 --- a/engine/loader_helpers.go +++ b/engine/loader_helpers.go @@ -208,8 +208,8 @@ var FileValidators = map[string]*FileLineRegexValidator{ regexp.MustCompile(`(?:\w+\s*),(?:(\w+;?)+\s*),(?:\*out\s*),(?:\w+\s*),(?:\w+\s*)$`), "Tenant([0-9A-Za-z_]),Account([0-9A-Za-z_.]),Direction(*out),ActionTimingsTag([0-9A-Za-z_]),ActionTriggersTag([0-9A-Za-z_])"}, utils.DERIVED_CHARGERS_CSV: &FileLineRegexValidator{utils.DERIVED_CHARGERS_NRCOLS, - regexp.MustCompile(`(?:\w+\s*),(?:\w+\s*),(?:\*out),(?:\w+\s*),(?:\*any\s*|\w+\s*),(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?`), - "Tenant[0-9A-Za-z_],Tor([0-9A-Za-z_]),Direction(*out),Account[0-9A-Za-z_],Subject([0-9A-Za-z_]|*any),RunId([^0-9A-Za-z_]|*default),ReqTypeField([^0-9A-Za-z_]|*default),DirectionField([^0-9A-Za-z_]|*default),TenantField([^0-9A-Za-z_]|*default),TorField([^0-9A-Za-z_]|*default),AccountField([^0-9A-Za-z_]|*default),SubjectField([^0-9A-Za-z_]|*default),DestinationField([^0-9A-Za-z_]|*default),SetupTimeField([^0-9A-Za-z_]|*default),AnswerTimeField([^0-9A-Za-z_]|*default),DurationField([^0-9A-Za-z_]|*default)"}, + regexp.MustCompile(`^(?:\*out),(?:[0-9A-Za-z_\.]+\s*),(?:\w+\s*),(?:\w+\s*),(?:\*any\s*|\w+\s*),(?:\w+\s*),(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?,(?:\*default\s*|\^*\w+\s*)?$`), + "Direction(*out),Tenant[0-9A-Za-z_],Category([0-9A-Za-z_]),Account[0-9A-Za-z_],Subject([0-9A-Za-z_]|*any),RunId([^0-9A-Za-z_]),ReqTypeField([^0-9A-Za-z_]|*default),DirectionField([^0-9A-Za-z_]|*default),TenantField([^0-9A-Za-z_]|*default),TorField([^0-9A-Za-z_]|*default),AccountField([^0-9A-Za-z_]|*default),SubjectField([^0-9A-Za-z_]|*default),DestinationField([^0-9A-Za-z_]|*default),SetupTimeField([^0-9A-Za-z_]|*default),AnswerTimeField([^0-9A-Za-z_]|*default),DurationField([^0-9A-Za-z_]|*default)"}, } func NewTPCSVFileParser(dirPath, fileName string) (*TPCSVFileParser, error) { diff --git a/engine/loader_helpers_test.go b/engine/loader_helpers_test.go index 8e96b83fd..b8dd0a0a9 100644 --- a/engine/loader_helpers_test.go +++ b/engine/loader_helpers_test.go @@ -92,18 +92,18 @@ cgrates.org,1001,*out,PREPAID_10,STANDARD_TRIGGERS DUMMY,INVALID;DATA cgrates.org,1002;1006,*out,PACKAGE_10,STANDARD_TRIGGERS ` -var derivedChargesSample = `#Tenant,Tor,Direction,Account,Subject,RunId,ReqTypeField,DirectionField,TenantField,TorField,AccountField,SubjectField,DestinationField,SetupTimeField,AnswerTimeField,DurationField -cgrates.org,call,*out,dan,dan,extra1,^prepaid,,,,rif,rif,,,, -cgrates.org,,*out,dan,dan,extra1,^prepaid,,,,rif,rif,,,, -cgrates.org,call,*in,dan,dan,extra1,^prepaid,,,,rif,rif,,,, +var derivedChargesSample = `#Direction,Tenant,Tor,Account,Subject,RunId,ReqTypeField,DirectionField,TenantField,TorField,AccountField,SubjectField,DestinationField,SetupTimeField,AnswerTimeField,DurationField +*out,cgrates.org,call,dan,dan,extra1,^prepaid,,,,rif,rif,,,, +*out,cgrates.org,,dan,dan,extra1,^prepaid,,,,rif,rif,,,, +*in,cgrates.org,call,dan,dan,extra1,^prepaid,,,,rif,rif,,,, DUMMY_DATA -cgrates.org,call,*out,dan,dan,extra2,,,,,ivo,ivo,,,, -cgrates.org,call,*out,dan,*any,extra1,,,,,rif2,rif2,,,, -cgrates.org,call,*out,dan,*any,*any,,,,,rif2,rif2,,,, -cgrates.org,call,*out,dan,*any,*default,*default,*default,*default,*default,rif2,rif2,*default,*default,*default,*default -cgrates.org,call,*out,dan,*any,^test,^test,^test,^test,^test,^test,^test,^test,^test,^test,^test -cgrates.org,call,*out,dan,*any,,,,,,,,,,, -cgrates.org,call,*out,dan,*default,,,,,,,,,,, +*out,cgrates.org,call,dan,dan,extra2,,,,,ivo,ivo,,,, +*out,cgrates.org,call,dan,*any,extra1,,,,,rif2,rif2,,,, +*out,cgrates.org,call,dan,*any,*any,,,,,rif2,rif2,,,, +*out,cgrates.org,call,dan,*any,*default,*default,*default,*default,*default,rif2,rif2,*default,*default,*default,*default +*out,cgrates.org,call,dan,*any,test,^test,^test,^test,^test,^test,^test,^test,^test,^test,^test +*out,cgrates.org,call,dan,*any,run1,,,,,,,,,, +*out,cgrates.org,call,dan,*default,,,,,,,,,,, ` func TestTimingsValidator(t *testing.T) { @@ -382,11 +382,11 @@ func TestDerivedChargersValidator(t *testing.T) { } valid := lnValidator.Rule.Match(ln) switch lineNr { - case 1, 3, 4, 5, 8, 12: + case 1, 3, 4, 5, 8, 9, 12: if valid { t.Error("Validation passed for invalid line", string(ln)) } - case 2, 6, 7, 9, 10, 11: + case 2, 6, 7, 10, 11: if !valid { t.Error("Validation did not pass for valid line", string(ln)) } diff --git a/mediator/mediator_local_test.go b/mediator/mediator_local_test.go index af6cfe6f0..3ca4f84a1 100644 --- a/mediator/mediator_local_test.go +++ b/mediator/mediator_local_test.go @@ -138,7 +138,7 @@ func TestPostCdrs(t *testing.T) { return } cdrForm1 := url.Values{utils.TOR: []string{utils.VOICE}, utils.ACCID: []string{"dsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{"rated"}, utils.DIRECTION: []string{"*out"}, - utils.TENANT: []string{"cgrates.org"}, utils.CATEGORY: []string{"call"}, utils.ACCOUNT: []string{"1001"}, utils.SUBJECT: []string{"1001"}, + utils.TENANT: []string{"cgrates.org"}, utils.CATEGORY: []string{"call"}, utils.ACCOUNT: []string{"2001"}, utils.SUBJECT: []string{"2001"}, utils.DESTINATION: []string{"+4986517174963"}, utils.ANSWER_TIME: []string{"2013-11-07T08:42:26Z"}, utils.USAGE: []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}} cdrForm2 := url.Values{utils.TOR: []string{utils.VOICE}, utils.ACCID: []string{"adsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{"rated"}, utils.DIRECTION: []string{"*out"}, @@ -227,7 +227,7 @@ func TestRateCdrs(t *testing.T) { } if errRatedCdrs, err := cdrStor.GetStoredCdrs(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0, 0, time.Time{}, time.Time{}, false, true, false); err != nil { t.Error(err) - } else if len(errRatedCdrs) != 6 { // The first 2 with errors should be still there before rerating + } else if len(errRatedCdrs) != 8 { // The first 2 with errors should be still there before rerating t.Error(fmt.Sprintf("Unexpected number of CDRs with errors: %d", len(errRatedCdrs))) } if err := cgrRpc.Call("MediatorV1.RateCdrs", utils.AttrRateCdrs{RerateErrors: true}, &reply); err != nil { @@ -237,7 +237,7 @@ func TestRateCdrs(t *testing.T) { } if errRatedCdrs, err := cdrStor.GetStoredCdrs(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0, 0, time.Time{}, time.Time{}, false, true, false); err != nil { t.Error(err) - } else if len(errRatedCdrs) != 2 { + } else if len(errRatedCdrs) != 4 { t.Error(fmt.Sprintf("Unexpected number of CDRs with errors: %d", len(errRatedCdrs))) } }