diff --git a/data/tariffplans/cdrstats/ActionTriggers.csv b/data/tariffplans/cdrstats/ActionTriggers.csv index 5fecaccf9..b32fe8f5e 100644 --- a/data/tariffplans/cdrstats/ActionTriggers.csv +++ b/data/tariffplans/cdrstats/ActionTriggers.csv @@ -1,6 +1,6 @@ -#Tag,BalanceTag,Direction,ThresholdType,ThresholdValue,Recurrent,MinSleep,BalanceDestinationTag,BalanceWeight,BalanceExpiryTime,BalanceRatingSubject,BalanceCategory,BalanceSharedGroup,StatsMinQueuedItems,ActionsTag,Weight -CDRST3_WARN_ASR,,,*min_asr,45,true,1h,,,,,,,3,CDRST_LOG,10 -CDRST3_WARN_ACD,,,*min_acd,10,true,1h,,,,,,,5,CDRST_LOG,10 -CDRST3_WARN_ACC,,,*max_acc,10,true,10m,,,,,,,5,CDRST_LOG,10 -CDRST4_WARN_ASR,,,*min_asr,30,true,0,,,,,,,5,CDRST_LOG,10 -CDRST4_WARN_ACD,,,*min_acd,3,true,0,,,,,,,2,CDRST_LOG,10 +#Tag[0],ThresholdType[1],ThresholdValue[2],Recurrent[3],MinSleep[4],BalanceType[5],BalanceDirection[6],BalanceCategory[7],BalanceDestinationTag[8],BalanceRatingSubject[9],BalanceSharedGroup[10],BalanceExpiryTime[11],BalanceWeight[12],StatsMinQueuedItems[13],ActionsTag[14],Weight[15] +CDRST3_WARN_ASR,*min_asr,45,true,1h,,,,,,,,,3,CDRST_LOG,10 +CDRST3_WARN_ACD,*min_acd,10,true,1h,,,,,,,,,5,CDRST_LOG,10 +CDRST3_WARN_ACC,*max_acc,10,true,10m,,,,,,,,,5,CDRST_LOG,10 +CDRST4_WARN_ASR,*min_asr,30,true,0,,,,,,,,,5,CDRST_LOG,10 +CDRST4_WARN_ACD,*min_acd,3,true,0,,,,,,,,,2,CDRST_LOG,10 diff --git a/data/tariffplans/prepaid1centpsec/ActionTriggers.csv b/data/tariffplans/prepaid1centpsec/ActionTriggers.csv index a31079d98..d6dccb5b1 100644 --- a/data/tariffplans/prepaid1centpsec/ActionTriggers.csv +++ b/data/tariffplans/prepaid1centpsec/ActionTriggers.csv @@ -1,9 +1,9 @@ -#Tag,BalanceTag,Direction,ThresholdType,ThresholdValue,Recurrent,MinSleep,BalanceDestinationTag,BalanceWeight,BalanceExpiryTime,BalanceRatingSubject,BalanceCategory,BalanceSharedGroup,StatsMinQueuedItems,ActionsTag,Weight -STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,false,0,,,,,,,,LOG_BALANCE,10 -STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,false,0,,,,,,,,LOG_BALANCE,10 -STANDARD_TRIGGERS,*monetary,*out,*max_counter,15,false,0,FS_USERS,,,,,,,LOG_BALANCE,10 -CDRST1_WARN_ASR,,,*min_asr,45,true,1h,,,,,,,3,CDRST_WARN_HTTP,10 -CDRST1_WARN_ACD,,,*min_acd,10,true,1h,,,,,,,5,CDRST_WARN_HTTP,10 -CDRST1_WARN_ACC,,,*max_acc,10,true,10m,,,,,,,5,CDRST_WARN_HTTP,10 -CDRST2_WARN_ASR,,,*min_asr,30,true,0,,,,,,,5,CDRST_WARN_HTTP,10 -CDRST2_WARN_ACD,,,*min_acd,3,true,0,,,,,,,2,CDRST_LOG,10 +#Tag[0],ThresholdType[1],ThresholdValue[2],Recurrent[3],MinSleep[4],BalanceType[5],BalanceDirection[6],BalanceCategory[7],BalanceDestinationTag[8],BalanceRatingSubject[9],BalanceSharedGroup[10],BalanceExpiryTime[11],BalanceWeight[12],StatsMinQueuedItems[13],ActionsTag[14],Weight[15] +STANDARD_TRIGGERS,*min_balance,2,false,0,*monetary,*out,,,,,,,,LOG_BALANCE,10 +STANDARD_TRIGGERS,*max_balance,20,false,0,*monetary,*out,,,,,,,,LOG_BALANCE,10 +STANDARD_TRIGGERS,*max_counter,15,false,0,*monetary,*out,,FS_USERS,,,,,,LOG_BALANCE,10 +CDRST1_WARN_ASR,*min_asr,45,true,1h,,,,,,,,,3,CDRST_WARN_HTTP,10 +CDRST1_WARN_ACD,*min_acd,10,true,1h,,,,,,,,,5,CDRST_WARN_HTTP,10 +CDRST1_WARN_ACC,*max_acc,10,true,10m,,,,,,,,,5,CDRST_WARN_HTTP,10 +CDRST2_WARN_ASR,*min_asr,30,true,0,,,,,,,,,5,CDRST_WARN_HTTP,10 +CDRST2_WARN_ACD,*min_acd,3,true,0,,,,,,,,,2,CDRST_LOG,10 diff --git a/data/tariffplans/tutorial/ActionTriggers.csv b/data/tariffplans/tutorial/ActionTriggers.csv index 96a49a73a..0e15b7231 100644 --- a/data/tariffplans/tutorial/ActionTriggers.csv +++ b/data/tariffplans/tutorial/ActionTriggers.csv @@ -1,13 +1,12 @@ -#Tag,BalanceTag,Direction,ThresholdType,ThresholdValue,Recurrent,MinSleep,BalanceDestinationTag,BalanceWeight,BalanceExpiryTime,BalanceRatingSubject,BalanceCategory,BalanceSharedGroup,StatsMinQueuedItems,ActionsTag,Weight -##Tag,BalanceTag,Direction,ThresholdType,ThresholdValue,Recurrent,MinSleep,BalanceCategory,BalanceRatingSubject,BalanceDestinationTag,BalanceExpiryTime,BalanceSharedGroup,BalanceWeight,StatsMinQueuedItems,ActionsTag,Weight -STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,false,0,,,,,,,,LOG_WARNING,10 -STANDARD_TRIGGERS,*monetary,*out,*max_counter,5,false,0,FS_USERS,,,,,,,LOG_WARNING,10 -STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,false,0,,,,,,,,LOG_WARNING,10 -STANDARD_TRIGGERS,*monetary,*out,*max_balance,100,false,0,,,,,,,,DISABLE_AND_LOG,10 -CDRST1_WARN,,,*min_asr,45,true,1m,,,,,,,3,LOG_WARNING,10 -CDRST1_WARN,,,*min_acd,10,true,1m,,,,,,,5,LOG_WARNING,10 -CDRST1_WARN,,,*max_acc,10,true,1m,,,,,,,5,LOG_WARNING,10 -CDRST1001_WARN,,,*min_asr,65,true,1m,,,,,,,3,LOG_WARNING,10 -CDRST1001_WARN,,,*min_acd,10,true,1m,,,,,,,5,LOG_WARNING,10 -CDRST1001_WARN,,,*max_acc,5,true,1m,,,,,,,5,LOG_WARNING,10 -CDRST3_WARN,,,*min_acd,60,false,1m,,,,,,,5,LOG_WARNING,10 +#Tag[0],ThresholdType[1],ThresholdValue[2],Recurrent[3],MinSleep[4],BalanceType[5],BalanceDirection[6],BalanceCategory[7],BalanceDestinationTag[8],BalanceRatingSubject[9],BalanceSharedGroup[10],BalanceExpiryTime[11],BalanceWeight[12],StatsMinQueuedItems[13],ActionsTag[14],Weight[15] +STANDARD_TRIGGERS,*min_balance,2,false,0,*monetary,*out,,,,,,,,LOG_WARNING,10 +STANDARD_TRIGGERS,*max_counter,5,false,0,*monetary,*out,,FS_USERS,,,,,,LOG_WARNING,10 +STANDARD_TRIGGERS,*max_balance,20,false,0,*monetary,*out,,,,,,,,LOG_WARNING,10 +STANDARD_TRIGGERS,*max_balance,100,false,0,*monetary,*out,,,,,,,,DISABLE_AND_LOG,10 +CDRST1_WARN,*min_asr,45,true,1m,,,,,,,,,3,LOG_WARNING,10 +CDRST1_WARN,*min_acd,10,true,1m,,,,,,,,,5,LOG_WARNING,10 +CDRST1_WARN,*max_acc,10,true,1m,,,,,,,,,5,LOG_WARNING,10 +CDRST1001_WARN,*min_asr,65,true,1m,,,,,,,,,3,LOG_WARNING,10 +CDRST1001_WARN,*min_acd,10,true,1m,,,,,,,,,5,LOG_WARNING,10 +CDRST1001_WARN,*max_acc,5,true,1m,,,,,,,,,5,LOG_WARNING,10 +CDRST3_WARN,*min_acd,60,false,1m,,,,,,,,,5,LOG_WARNING,10 diff --git a/engine/loader_csv.go b/engine/loader_csv.go index c84c5d38c..9d24c04e9 100644 --- a/engine/loader_csv.go +++ b/engine/loader_csv.go @@ -654,47 +654,46 @@ func (csvr *CSVReader) LoadActions() (err error) { if fp != nil { defer fp.Close() } - fieldIndex := CSV_FIELD_INDEX[utils.ACTIONS_CSV] for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() { - tag := record[fieldIndex[utils.CSVFLD_ACTIONS_TAG]] + tag := record[ACTSCSVIDX_TAG] var units float64 - if len(record[fieldIndex[utils.CSVFLD_UNITS]]) == 0 { // Not defined + if len(record[ACTSCSVIDX_UNITS]) == 0 { // Not defined units = 0.0 } else { - units, err = strconv.ParseFloat(record[fieldIndex[utils.CSVFLD_UNITS]], 64) + units, err = strconv.ParseFloat(record[ACTSCSVIDX_UNITS], 64) if err != nil { return fmt.Errorf("Could not parse action units: %v", err) } } var balanceWeight float64 - if len(record[fieldIndex[utils.CSVFLD_BALANCE_WEIGHT]]) == 0 { // Not defined + if len(record[ACTSCSVIDX_BALANCE_WEIGHT]) == 0 { // Not defined balanceWeight = 0.0 } else { - balanceWeight, err = strconv.ParseFloat(record[fieldIndex[utils.CSVFLD_BALANCE_WEIGHT]], 64) + balanceWeight, err = strconv.ParseFloat(record[ACTSCSVIDX_BALANCE_WEIGHT], 64) if err != nil { return fmt.Errorf("Could not parse action balance weight: %v", err) } } - weight, err := strconv.ParseFloat(record[fieldIndex[utils.CSVFLD_WEIGHT]], 64) + weight, err := strconv.ParseFloat(record[ACTSCSVIDX_WEIGHT], 64) if err != nil { return fmt.Errorf("Could not parse action weight: %v", err) } a := &Action{ Id: utils.GenUUID(), - ActionType: record[fieldIndex[utils.CSVFLD_ACTION]], - BalanceType: record[fieldIndex[utils.CSVFLD_BALANCE_TYPE]], - Direction: record[fieldIndex[utils.CSVFLD_DIRECTION]], + ActionType: record[ACTSCSVIDX_ACTION], + BalanceType: record[ACTSCSVIDX_BALANCE_TYPE], + Direction: record[ACTSCSVIDX_DIRECTION], Weight: weight, - ExpirationString: record[fieldIndex[utils.CSVFLD_EXPIRY_TIME]], - ExtraParameters: record[fieldIndex[utils.CSVFLD_EXTRA_PARAMS]], + ExpirationString: record[ACTSCSVIDX_EXPIRY_TIME], + ExtraParameters: record[ACTSCSVIDX_EXTRA_PARAMS], Balance: &Balance{ Uuid: utils.GenUUID(), Value: units, Weight: balanceWeight, - DestinationId: record[fieldIndex[utils.CSVFLD_DESTINATION_TAG]], - RatingSubject: record[fieldIndex[utils.CSVFLD_RATING_SUBJECT]], - Category: record[fieldIndex[utils.CSVFLD_CATEGORY]], - SharedGroup: record[fieldIndex[utils.CSVFLD_SHARED_GROUP]], + DestinationId: record[ACTSCSVIDX_DESTINATION_TAG], + RatingSubject: record[ACTSCSVIDX_RATING_SUBJECT], + Category: record[ACTSCSVIDX_CATEGORY], + SharedGroup: record[ACTSCSVIDX_SHARED_GROUP], }, } if _, err := utils.ParseDate(a.ExpirationString); err != nil { @@ -760,57 +759,57 @@ func (csvr *CSVReader) LoadActionTriggers() (err error) { defer fp.Close() } for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() { - tag := record[0] - value, err := strconv.ParseFloat(record[4], 64) + tag := record[ATRIGCSVIDX_TAG] + value, err := strconv.ParseFloat(record[ATRIGCSVIDX_THRESHOLD_VALUE], 64) if err != nil { - return fmt.Errorf("Could not parse action trigger value (%v): %v", record[4], err) + return fmt.Errorf("Could not parse action trigger threshold value (%v): %v", record[ATRIGCSVIDX_THRESHOLD_VALUE], err) } - recurrent, err := strconv.ParseBool(record[5]) + recurrent, err := strconv.ParseBool(record[ATRIGCSVIDX_RECURRENT]) if err != nil { - return fmt.Errorf("Could not parse action trigger recurrent flag (%v): %v", record[5], err) + return fmt.Errorf("Could not parse action trigger recurrent flag (%v): %v", record[ATRIGCSVIDX_RECURRENT], err) } - minSleep, err := time.ParseDuration(record[6]) + minSleep, err := time.ParseDuration(record[ATRIGCSVIDX_MIN_SLEEP]) if err != nil { - if record[6] == "" { + if record[ATRIGCSVIDX_MIN_SLEEP] == "" { minSleep = 0 } else { - return fmt.Errorf("Could not parse action trigger MinSleep (%v): %v", record[6], err) + return fmt.Errorf("Could not parse action trigger MinSleep (%v): %v", record[ATRIGCSVIDX_MIN_SLEEP], err) } } - balanceWeight, err := strconv.ParseFloat(record[8], 64) - if record[8] != "" && err != nil { - return fmt.Errorf("Could not parse action trigger BalanceWeight (%v): %v", record[8], err) + balanceWeight, err := strconv.ParseFloat(record[ATRIGCSVIDX_BAL_WEIGHT], 64) + if record[ATRIGCSVIDX_BAL_WEIGHT] != "" && err != nil { + return fmt.Errorf("Could not parse action trigger BalanceWeight (%v): %v", record[ATRIGCSVIDX_BAL_WEIGHT], err) } - balanceExp, err := utils.ParseTimeDetectLayout(record[9]) - if record[9] != "" && err != nil { - return fmt.Errorf("Could not parse action trigger BalanceExpirationDate (%v): %v", record[9], err) + balanceExp, err := utils.ParseTimeDetectLayout(record[ATRIGCSVIDX_BAL_EXPIRY_TIME]) + if record[ATRIGCSVIDX_BAL_EXPIRY_TIME] != "" && err != nil { + return fmt.Errorf("Could not parse action trigger BalanceExpirationDate (%v): %v", record[ATRIGCSVIDX_BAL_EXPIRY_TIME], err) } - minQI, err := strconv.Atoi(record[13]) - if record[13] != "" && err != nil { - return fmt.Errorf("Could not parse action trigger MinQueuedItems (%v): %v", record[13], err) + minQI, err := strconv.Atoi(record[ATRIGCSVIDX_STATS_MIN_QUEUED_ITEMS]) + if record[ATRIGCSVIDX_STATS_MIN_QUEUED_ITEMS] != "" && err != nil { + return fmt.Errorf("Could not parse action trigger MinQueuedItems (%v): %v", record[ATRIGCSVIDX_STATS_MIN_QUEUED_ITEMS], err) } - weight, err := strconv.ParseFloat(record[15], 64) + weight, err := strconv.ParseFloat(record[ATRIGCSVIDX_WEIGHT], 64) if err != nil { - return fmt.Errorf("Could not parse action trigger weight (%v): %v", record[15], err) + return fmt.Errorf("Could not parse action trigger weight (%v): %v", record[ATRIGCSVIDX_WEIGHT], err) } at := &ActionTrigger{ Id: utils.GenUUID(), - BalanceType: record[1], - Direction: record[2], - ThresholdType: record[3], + BalanceType: record[ATRIGCSVIDX_BAL_TYPE], + Direction: record[ATRIGCSVIDX_BAL_DIRECTION], + ThresholdType: record[ATRIGCSVIDX_THRESHOLD_TYPE], ThresholdValue: value, Recurrent: recurrent, MinSleep: minSleep, - DestinationId: record[7], + DestinationId: record[ATRIGCSVIDX_BAL_DESTINATION_TAG], BalanceWeight: balanceWeight, BalanceExpirationDate: balanceExp, - BalanceRatingSubject: record[10], - BalanceCategory: record[11], - BalanceSharedGroup: record[12], + BalanceRatingSubject: record[ATRIGCSVIDX_BAL_RATING_SUBJECT], + BalanceCategory: record[ATRIGCSVIDX_BAL_CATEGORY], + BalanceSharedGroup: record[ATRIGCSVIDX_BAL_SHARED_GROUP], MinQueuedItems: minQI, - ActionsId: record[14], + ActionsId: record[ATRIGCSVIDX_ACTIONS_TAG], Weight: weight, } csvr.actionsTriggers[tag] = append(csvr.actionsTriggers[tag], at) diff --git a/engine/loader_csv_test.go b/engine/loader_csv_test.go index 9832d9a62..c31e82a91 100644 --- a/engine/loader_csv_test.go +++ b/engine/loader_csv_test.go @@ -160,17 +160,18 @@ TOPUP_SHARED0_AT,SE0,ASAP,10 TOPUP_SHARED10_AT,SE10,ASAP,10 TOPUP_EMPTY_AT,EE0,ASAP,10 ` + actionTriggers = ` -STANDARD_TRIGGER,*voice,*out,*min_counter,10,false,0,GERMANY_O2,,,,,,,SOME_1,10 -STANDARD_TRIGGER,*voice,*out,*max_balance,200,false,0,GERMANY,,,,,,,SOME_2,10 -STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,false,0,,,,,,,,LOG_WARNING,10 -STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,false,0,,,,,,,,LOG_WARNING,10 -STANDARD_TRIGGERS,*monetary,*out,*max_counter,5,false,0,FS_USERS,,,,,,,LOG_WARNING,10 -CDRST1_WARN_ASR,,,*min_asr,45,true,1h,,,,,,,3,CDRST_WARN_HTTP,10 -CDRST1_WARN_ACD,,,*min_acd,10,true,1h,,,,,,,5,CDRST_WARN_HTTP,10 -CDRST1_WARN_ACC,,,*max_acc,10,true,10m,,,,,,,5,CDRST_WARN_HTTP,10 -CDRST2_WARN_ASR,,,*min_asr,30,true,0,,,,,,,5,CDRST_WARN_HTTP,10 -CDRST2_WARN_ACD,,,*min_acd,3,true,0,,,,,,,5,CDRST_WARN_HTTP,10 +STANDARD_TRIGGER,*min_counter,10,false,0,*voice,*out,,GERMANY_O2,,,,,,SOME_1,10 +STANDARD_TRIGGER,*max_balance,200,false,0,*voice,*out,,GERMANY,,,,,,SOME_2,10 +STANDARD_TRIGGERS,*min_balance,2,false,0,*monetary,*out,,,,,,,,LOG_WARNING,10 +STANDARD_TRIGGERS,*max_balance,20,false,0,*monetary,*out,,,,,,,,LOG_WARNING,10 +STANDARD_TRIGGERS,*max_counter,5,false,0,*monetary,*out,,FS_USERS,,,,,,LOG_WARNING,10 +CDRST1_WARN_ASR,*min_asr,45,true,1h,,,,,,,,,3,CDRST_WARN_HTTP,10 +CDRST1_WARN_ACD,*min_acd,10,true,1h,,,,,,,,,5,CDRST_WARN_HTTP,10 +CDRST1_WARN_ACC,*max_acc,10,true,10m,,,,,,,,,5,CDRST_WARN_HTTP,10 +CDRST2_WARN_ASR,*min_asr,30,true,0,,,,,,,,,5,CDRST_WARN_HTTP,10 +CDRST2_WARN_ACD,*min_acd,3,true,0,,,,,,,,,5,CDRST_WARN_HTTP,10 ` accountActions = ` vdf,minitsboy;a1;a2,*out,MORE_MINUTES,STANDARD_TRIGGER diff --git a/engine/loader_helpers.go b/engine/loader_helpers.go index d11851eb8..570298a74 100644 --- a/engine/loader_helpers.go +++ b/engine/loader_helpers.go @@ -34,6 +34,43 @@ import ( "github.com/cgrates/cgrates/utils" ) +// Define here fields within utils.ACTIONS_CSV file +const ( + ACTSCSVIDX_TAG = iota + ACTSCSVIDX_ACTION + ACTSCSVIDX_EXTRA_PARAMS + ACTSCSVIDX_BALANCE_TYPE + ACTSCSVIDX_DIRECTION + ACTSCSVIDX_CATEGORY + ACTSCSVIDX_DESTINATION_TAG + ACTSCSVIDX_RATING_SUBJECT + ACTSCSVIDX_SHARED_GROUP + ACTSCSVIDX_EXPIRY_TIME + ACTSCSVIDX_UNITS + ACTSCSVIDX_BALANCE_WEIGHT + ACTSCSVIDX_WEIGHT +) + +// Define here fields within utils.ACTION_TRIGGERS_CSV file +const ( + ATRIGCSVIDX_TAG = iota + ATRIGCSVIDX_THRESHOLD_TYPE + ATRIGCSVIDX_THRESHOLD_VALUE + ATRIGCSVIDX_RECURRENT + ATRIGCSVIDX_MIN_SLEEP + ATRIGCSVIDX_BAL_TYPE + ATRIGCSVIDX_BAL_DIRECTION + ATRIGCSVIDX_BAL_CATEGORY + ATRIGCSVIDX_BAL_DESTINATION_TAG + ATRIGCSVIDX_BAL_RATING_SUBJECT + ATRIGCSVIDX_BAL_SHARED_GROUP + ATRIGCSVIDX_BAL_EXPIRY_TIME + ATRIGCSVIDX_BAL_WEIGHT + ATRIGCSVIDX_STATS_MIN_QUEUED_ITEMS + ATRIGCSVIDX_ACTIONS_TAG + ATRIGCSVIDX_WEIGHT +) + type TPLoader interface { LoadDestinations() error LoadRates() error @@ -97,7 +134,6 @@ func NewTiming(timingInfo ...string) (rt *utils.TPTiming) { } func UpdateCdrStats(cs *CdrStats, triggers ActionTriggerPriotityList, tpCs *utils.TPCdrStat) { - if tpCs.QueueLength != "" { if qi, err := strconv.Atoi(tpCs.QueueLength); err == nil { cs.QueueLength = qi @@ -312,26 +348,6 @@ type FileLineRegexValidator struct { Message string // Pass this message as helper } -// Keep here the index reference for all the files, so we can use it as base for both loader and importer -//ToDo: Add the rest of the files -var CSV_FIELD_INDEX = map[string]map[string]int{ - utils.ACTIONS_CSV: map[string]int{ - utils.CSVFLD_ACTIONS_TAG: 0, - utils.CSVFLD_ACTION: 1, - utils.CSVFLD_EXTRA_PARAMS: 2, - utils.CSVFLD_BALANCE_TYPE: 3, - utils.CSVFLD_DIRECTION: 4, - utils.CSVFLD_CATEGORY: 5, - utils.CSVFLD_DESTINATION_TAG: 6, - utils.CSVFLD_RATING_SUBJECT: 7, - utils.CSVFLD_SHARED_GROUP: 8, - utils.CSVFLD_EXPIRY_TIME: 9, - utils.CSVFLD_UNITS: 10, - utils.CSVFLD_BALANCE_WEIGHT: 11, - utils.CSVFLD_WEIGHT: 12, - }, -} - var FileValidators = map[string]*FileLineRegexValidator{ utils.DESTINATIONS_CSV: &FileLineRegexValidator{utils.DESTINATIONS_NRCOLS, regexp.MustCompile(`(?:\w+\s*,\s*){1}(?:\+?\d+.?\d*){1}$`), @@ -360,8 +376,8 @@ var FileValidators = map[string]*FileLineRegexValidator{ utils.ACTION_PLANS_CSV: &FileLineRegexValidator{utils.ACTION_PLANS_NRCOLS, regexp.MustCompile(`(?:\w+\s*,\s*){3}(?:\d+\.?\d*){1}`), "Tag([0-9A-Za-z_]),ActionsTag([0-9A-Za-z_]),TimingTag([0-9A-Za-z_]),Weight([0-9.])"}, - utils.ACTION_TRIGGERS_CSV: &FileLineRegexValidator{utils.ACTION_TRIGGERS_NRCOLS, regexp.MustCompile(`(?:\w+),(?:\*\w+)?,(?:\*out)?,(?:\*\w+),(?:\d+\.?\d*),(?:true|false)?,(?:\d+[smh]?),(?:\w+|\*any)?,(?:\d+\.?\d*)?,(?:\*\w+\s*|\+\d+[smh]\s*|\d+\s*)?,(?:\w+|\*any)?,(?:\w+|\*any)?,(?:\w+|\*any)?,(?:\d+)?,(?:\w+),(?:\d+\.?\d*)$`), - "Tag([0-9A-Za-z_]),BalanceType(*[a-z_]),Direction(*out),ThresholdType(*[a-z_]),ThresholdValue([0-9]+),Recurrent(true|false),MinSleep([0-9]+)?,BalanceDestinationTag([0-9A-Za-z_]|*all),BalanceWeight(*[a-z_]),BalanceExpiryTime(*[a-z_]|+[0-9][smh]|[0-9]),BalanceRatingSubject(*[a-z_]),BalanceCategory([a-z_]),BalanceSharedGroup(*[a-z_]),StatsMinQueuedItems([0-9]+),ActionsTag([0-9A-Za-z_]),Weight([0-9]+)"}, + utils.ACTION_TRIGGERS_CSV: &FileLineRegexValidator{utils.ACTION_TRIGGERS_NRCOLS, regexp.MustCompile(`(?:\w+),(?:\*\w+),(?:\d+\.?\d*),(?:true|false)?,(?:\d+[smh]?),(?:\*\w+)?,(?:\*out)?,(?:\w+|\*any)?,(?:\w+|\*any)?,(?:\w+|\*any)?,(?:\w+|\*any)?,(?:\*\w+\s*|\+\d+[smh]\s*|\d+\s*)?,(?:\d+\.?\d*)?,(?:\d+)?,(?:\w+),(?:\d+\.?\d*)$`), + "Tag([0-9A-Za-z_]),ThresholdType(*[a-z_]),ThresholdValue([0-9]+),Recurrent(true|false),MinSleep([0-9]+)?,#### BalanceType(*[a-z_]),BalanceDirection(*out),BalanceCategory([a-z_]),BalanceDestinationTag([0-9A-Za-z_]|*all),BalanceRatingSubject(*[a-z_]),BalanceSharedGroup(*[a-z_]),BalanceExpiryTime(*[a-z_]|+[0-9][smh]|[0-9]),BalanceWeight(*[a-z_]),StatsMinQueuedItems([0-9]+),ActionsTag([0-9A-Za-z_]),Weight([0-9]+)"}, utils.ACCOUNT_ACTIONS_CSV: &FileLineRegexValidator{utils.ACCOUNT_ACTIONS_NRCOLS, 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_])"}, diff --git a/engine/loader_helpers_test.go b/engine/loader_helpers_test.go index b78bc889f..7ac8ea9ea 100644 --- a/engine/loader_helpers_test.go +++ b/engine/loader_helpers_test.go @@ -76,10 +76,10 @@ DUMMY,INVALID;DATA ` var actionTriggersSample = `#Tag,BalanceTag,Direction,ThresholdType,ThresholdValue,Recurrent,MinSleep,BalanceDestinationTag,BalanceWeight,BalanceExpiryTime,BalanceRatingSubject,BalanceCategory,BalanceSharedGroup,StatsMinQueuedItems,ActionsTag,Weight -STANDARD_TRIGGERS,*monetary,*out,*min_balance,2,false,0,,,,,,,,LOG_WARNING,10 -STANDARD_TRIGGERS,*monetary,*out,*max_balance,20,false,0,,,,,,,,LOG_WARNING,10 -STANDARD_TRIGGERS,*monetary,*out,*max_counter,15,false,0,FS_USERS,,,,,,,LOG_WARNING,10 -CDRST1_WARN_ASR,,,*min_asr,45,true,1h,,,,,,,3,CDRST_WARN_HTTP,10 +STANDARD_TRIGGERS,*min_balance,2,false,0,*monetary,*out,,,,,,,,LOG_WARNING,10 +STANDARD_TRIGGERS,*max_balance,20,false,0,*monetary,*out,,,,,,,,LOG_WARNING,10 +STANDARD_TRIGGERS,*max_counter,15,false,0,*monetary,*out,,FS_USERS,,,,,,LOG_WARNING,10 +CDRST1_WARN_ASR,*min_asr,45,true,1h,,,,,,,,,3,CDRST_WARN_HTTP,10 DUMMY,INVALID;DATA ` diff --git a/engine/tpimporter_csv.go b/engine/tpimporter_csv.go index b21d2e4b1..d2c25d84a 100644 --- a/engine/tpimporter_csv.go +++ b/engine/tpimporter_csv.go @@ -367,7 +367,6 @@ func (self *TPCSVImporter) importActions(fn string) error { if err != nil { return err } - fieldIndex := CSV_FIELD_INDEX[utils.ACTIONS_CSV] acts := make(map[string][]*utils.TPAction) lineNr := 0 for { @@ -381,18 +380,18 @@ func (self *TPCSVImporter) importActions(fn string) error { } continue } - actId, actionType, balanceType, direction, destTag, rateSubject, category, sharedGroup := record[fieldIndex[utils.CSVFLD_ACTIONS_TAG]], record[fieldIndex[utils.CSVFLD_ACTION]], - record[fieldIndex[utils.CSVFLD_BALANCE_TYPE]], record[fieldIndex[utils.CSVFLD_DIRECTION]], record[fieldIndex[utils.CSVFLD_DESTINATION_TAG]], record[fieldIndex[utils.CSVFLD_RATING_SUBJECT]], - record[fieldIndex[utils.CSVFLD_CATEGORY]], record[fieldIndex[utils.CSVFLD_SHARED_GROUP]] - units, err := strconv.ParseFloat(record[fieldIndex[utils.CSVFLD_UNITS]], 64) - if err != nil && record[fieldIndex[utils.CSVFLD_UNITS]] != "" { + actId, actionType, balanceType, direction, destTag, rateSubject, category, sharedGroup := record[ACTSCSVIDX_TAG], record[ACTSCSVIDX_ACTION], + record[ACTSCSVIDX_BALANCE_TYPE], record[ACTSCSVIDX_DIRECTION], record[ACTSCSVIDX_DESTINATION_TAG], record[ACTSCSVIDX_RATING_SUBJECT], + record[ACTSCSVIDX_CATEGORY], record[ACTSCSVIDX_SHARED_GROUP] + units, err := strconv.ParseFloat(record[ACTSCSVIDX_UNITS], 64) + if err != nil && record[ACTSCSVIDX_UNITS] != "" { if self.Verbose { log.Printf("Ignoring line %d, warning: <%s> ", lineNr, err.Error()) } continue } - balanceWeight, _ := strconv.ParseFloat(record[fieldIndex[utils.CSVFLD_BALANCE_WEIGHT]], 64) - weight, err := strconv.ParseFloat(record[fieldIndex[utils.CSVFLD_WEIGHT]], 64) + balanceWeight, _ := strconv.ParseFloat(record[ACTSCSVIDX_BALANCE_WEIGHT], 64) + weight, err := strconv.ParseFloat(record[ACTSCSVIDX_WEIGHT], 64) if err != nil { if self.Verbose { log.Printf("Ignoring line %d, warning: <%s> ", lineNr, err.Error()) @@ -407,13 +406,13 @@ func (self *TPCSVImporter) importActions(fn string) error { BalanceType: balanceType, Direction: direction, Units: units, - ExpiryTime: record[5], + ExpiryTime: record[ACTSCSVIDX_EXPIRY_TIME], DestinationId: destTag, RatingSubject: rateSubject, Category: category, SharedGroup: sharedGroup, BalanceWeight: balanceWeight, - ExtraParameters: record[fieldIndex[utils.CSVFLD_EXTRA_PARAMS]], + ExtraParameters: record[ACTSCSVIDX_EXTRA_PARAMS], Weight: weight, }) } @@ -494,37 +493,39 @@ func (self *TPCSVImporter) importActionTriggers(fn string) error { } continue } - tag, balanceType, direction, thresholdType, destinationTag, balanceExpirationDate, balanceRatingSubject, balanceCategory, balanceSharedGroup, actionsTag := record[0], record[1], record[2], record[3], record[7], record[9], record[10], record[10], record[12], record[14] - threshold, err := strconv.ParseFloat(record[4], 64) + tag, balanceType, direction, thresholdType, destinationTag, balanceExpirationDate, balanceRatingSubject, balanceCategory, balanceSharedGroup, actionsTag := record[ATRIGCSVIDX_TAG], record[ATRIGCSVIDX_BAL_TYPE], + record[ATRIGCSVIDX_BAL_DIRECTION], record[ATRIGCSVIDX_THRESHOLD_TYPE], record[ATRIGCSVIDX_BAL_DESTINATION_TAG], record[ATRIGCSVIDX_BAL_EXPIRY_TIME], record[ATRIGCSVIDX_BAL_RATING_SUBJECT], + record[ATRIGCSVIDX_BAL_CATEGORY], record[ATRIGCSVIDX_BAL_SHARED_GROUP], record[ATRIGCSVIDX_ACTIONS_TAG] + threshold, err := strconv.ParseFloat(record[ATRIGCSVIDX_THRESHOLD_VALUE], 64) if err != nil { if self.Verbose { log.Printf("Ignoring line %d, warning: <%s> ", lineNr, err.Error()) } continue } - recurrent, err := strconv.ParseBool(record[5]) + recurrent, err := strconv.ParseBool(record[ATRIGCSVIDX_RECURRENT]) if err != nil { log.Printf("Ignoring line %d, warning: <%s>", lineNr, err.Error()) continue } - minSleep, err := time.ParseDuration(record[6]) - if err != nil && record[6] != "" { + minSleep, err := time.ParseDuration(record[ATRIGCSVIDX_MIN_SLEEP]) + if err != nil && record[ATRIGCSVIDX_MIN_SLEEP] != "" { log.Printf("Ignoring line %d, warning: <%s>", lineNr, err.Error()) continue } - balanceWeight, err := strconv.ParseFloat(record[8], 64) - if err != nil && record[8] != "" { + balanceWeight, err := strconv.ParseFloat(record[ATRIGCSVIDX_BAL_WEIGHT], 64) + if err != nil && record[ATRIGCSVIDX_BAL_WEIGHT] != "" { if self.Verbose { log.Printf("Ignoring line %d, warning: <%s> ", lineNr, err.Error()) } continue } - minQueuedItems, err := strconv.Atoi(record[13]) - if err != nil && record[12] != "" { + minQueuedItems, err := strconv.Atoi(record[ATRIGCSVIDX_STATS_MIN_QUEUED_ITEMS]) + if err != nil && record[ATRIGCSVIDX_STATS_MIN_QUEUED_ITEMS] != "" { log.Printf("Ignoring line %d, warning: <%s>", lineNr, err.Error()) continue } - weight, err := strconv.ParseFloat(record[15], 64) + weight, err := strconv.ParseFloat(record[ATRIGCSVIDX_WEIGHT], 64) if err != nil { if self.Verbose { log.Printf("Ignoring line %d, warning: <%s> ", lineNr, err.Error()) diff --git a/utils/consts.go b/utils/consts.go index c16a3a32a..b36d486aa 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -53,19 +53,6 @@ const ( ACCOUNT_ACTIONS_CSV = "AccountActions.csv" DERIVED_CHARGERS_CSV = "DerivedChargers.csv" CDR_STATS_CSV = "CdrStats.csv" - CSVFLD_ACTIONS_TAG = "ActionsTag" - CSVFLD_ACTION = "Action" - CSVFLD_EXTRA_PARAMS = "ExtraParameters" - CSVFLD_BALANCE_TYPE = "BalanceType" - CSVFLD_DIRECTION = "Direction" - CSVFLD_CATEGORY = "Category" - CSVFLD_DESTINATION_TAG = "DestinationTag" - CSVFLD_RATING_SUBJECT = "RatingSubject" - CSVFLD_SHARED_GROUP = "SharedGroup" - CSVFLD_EXPIRY_TIME = "ExpiryTime" - CSVFLD_UNITS = "Units" - CSVFLD_BALANCE_WEIGHT = "BalanceWeight" - CSVFLD_WEIGHT = "Weight" TIMINGS_NRCOLS = 6 DESTINATIONS_NRCOLS = 2 RATES_NRCOLS = 6