Adding *voice balance and derived charging inside fs_json tutorial, fixup loading of derived charging from csv

This commit is contained in:
DanB
2014-06-15 19:05:00 +02:00
parent c973ea99e2
commit bc5a80fe25
11 changed files with 30 additions and 23 deletions

View File

@@ -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())

View File

@@ -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,,,,
1 #Tenant #Direction Tenant Direction Tor Account Subject RunId ReqTypeField DirectionField TenantField TorField AccountField SubjectField DestinationField SetupTimeField AnswerTimeField DurationField
2 cgrates.org *out cgrates.org *out call dan dan extra1 ^prepaid ^rif ^rif ^1s
3 cgrates.org *out cgrates.org *out call dan dan extra2 ^ivo ^ivo
4 cgrates.org *out cgrates.org *out call dan *any extra1 ^rif2 ^rif2

View File

@@ -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
1 #ActionsTag Action BalanceType Direction Units ExpiryTime DestinationTag RatingSubject BalanceWeight SharedGroup ExtraParameters Weight
2 TOPUP_RST_10 *topup_reset *monetary *out 10 *unlimited *any 10 10
3 TOPUP_RST_5 *topup_reset *monetary *out 5 *unlimited *any 20 10
4 TOPUP_RST_5 *topup_reset *voice *out 5 *unlimited DST_1002 SPECIAL_1002 20 10
5 TOPUP_RST_SHARED_5 *topup *monetary *out 5 *unlimited *any 10 SHARED_A 10
6 SHARED_A_0 *topup_reset *monetary *out 0 *unlimited *any 10 SHARED_A 10
7 LOG_WARNING *log 10

View File

@@ -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
1 #Direction Tenant Category Account Subject RunId ReqTypeField DirectionField TenantField TorField AccountField SubjectField DestinationField SetupTimeField AnswerTimeField UsageField
2 *out cgrates.org call 1001 1001 fs_json_run ^rated *default *default *default 1010 1010 *default *default *default *default

View File

@@ -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
1 #Tag DestinationsTag RatesTag RoundingMethod RoundingDecimals
5 DR_1003_10CNT DST_1003 RT_10CNT *up 4
6 DR_FS_40CNT DST_FS RT_40CNT *up 4
7 DR_FS_10CNT DST_FS RT_10CNT *up 4
8 DR_SPECIAL_1002 DST_1002 RT_1CNT *up 4

View File

@@ -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
1 #Tag ConnectFee Rate RateUnit RateIncrement GroupIntervalStart
5 RT_20CNT 0 0.1 60s 1s 60s
6 RT_40CNT 0.8 0.4 60s 30s 0s
7 RT_40CNT 0 0.2 60s 10s 60s
8 RT_1CNT 0 0.01 60s 60s 0s

View File

@@ -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
1 #Tag DestinationRatesTag TimingTag Weight
15 RP_RETAIL2 DR_FS_10CNT OFFPEAK_MORNING 10
16 RP_RETAIL2 DR_FS_10CNT OFFPEAK_EVENING 10
17 RP_RETAIL2 DR_FS_10CNT OFFPEAK_WEEKEND 10
18 RP_SPECIAL_1002 DR_SPECIAL_1002 ALWAYS 10

View File

@@ -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,
1 #Direction Tenant Category Subject ActivationTime RatingPlanId RatesFallbackSubject
2 *out cgrates.org call *any 2014-01-14T00:00:00Z RP_RETAIL1
3 *out cgrates.org call 1001;1006 2014-01-14T00:00:00Z RP_RETAIL2
4 *out cgrates.org call SPECIAL_1002 2014-01-14T00:00:00Z RP_SPECIAL_1002

View File

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

View File

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

View File

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