diff --git a/engine/rateinterval.go b/engine/rateinterval.go index 91bebe5c4..d47ec82f3 100644 --- a/engine/rateinterval.go +++ b/engine/rateinterval.go @@ -53,9 +53,14 @@ func (rit *RITiming) CronString() string { return rit.cronString } var sec, min, hour, monthday, month, weekday, year string - if len(rit.StartTime) == 0 { + switch rit.StartTime { + case "": hour, min, sec = "*", "*", "*" - } else { + case utils.MetaEveryMinute: + hour, min, sec = "*", "*", "0" + case utils.MetaHourly: + hour, min, sec = "*", "0", "0" + default: hms := strings.Split(rit.StartTime, ":") if len(hms) == 3 { hour, min, sec = hms[0], hms[1], hms[2] diff --git a/engine/rateinterval_test.go b/engine/rateinterval_test.go index 93592dbd9..072b5f97c 100644 --- a/engine/rateinterval_test.go +++ b/engine/rateinterval_test.go @@ -348,6 +348,23 @@ func TestRateIntervalCronEmpty(t *testing.T) { } } +func TestRITimingCronEveryX(t *testing.T) { + rit := &RITiming{ + StartTime: utils.MetaEveryMinute, + } + eCronStr := "0 * * * * * *" + if cronStr := rit.CronString(); cronStr != eCronStr { + t.Errorf("Expecting: <%s>, received: <%s>", eCronStr, cronStr) + } + rit = &RITiming{ + StartTime: utils.MetaHourly, + } + eCronStr = "0 0 * * * * *" + if cronStr := rit.CronString(); cronStr != eCronStr { + t.Errorf("Expecting: <%s>, received: <%s>", eCronStr, cronStr) + } +} + func TestRateIntervalCost(t *testing.T) { ri := &RateInterval{ Rating: &RIRate{ diff --git a/engine/tp_reader.go b/engine/tp_reader.go index d25ac9c81..2a6a455af 100644 --- a/engine/tp_reader.go +++ b/engine/tp_reader.go @@ -85,6 +85,24 @@ func NewTpReader(db DataDB, lr LoadReader, tpid, timezone string) *TpReader { StartTime: utils.ASAP, EndTime: "", } + tpr.timings[utils.MetaEveryMinute] = &utils.TPTiming{ + ID: utils.MetaEveryMinute, + Years: utils.Years{}, + Months: utils.Months{}, + MonthDays: utils.MonthDays{}, + WeekDays: utils.WeekDays{}, + StartTime: utils.MetaEveryMinute, + EndTime: "", + } + tpr.timings[utils.MetaHourly] = &utils.TPTiming{ + ID: utils.MetaHourly, + Years: utils.Years{}, + Months: utils.Months{}, + MonthDays: utils.MonthDays{}, + WeekDays: utils.WeekDays{}, + StartTime: utils.MetaHourly, + EndTime: "", + } return tpr } diff --git a/utils/consts.go b/utils/consts.go index 45e0f8cda..57284b5df 100644 --- a/utils/consts.go +++ b/utils/consts.go @@ -370,4 +370,6 @@ const ( MetaFileCSV = "*file_csv" MetaFileFWV = "*file_fwv" Accounts = "Accounts" + MetaEveryMinute = "*every_minute" + MetaHourly = "*hourly" ) diff --git a/utils/value_formula.go b/utils/value_formula.go index 823360824..a1a2e38f3 100644 --- a/utils/value_formula.go +++ b/utils/value_formula.go @@ -102,5 +102,21 @@ func incrementalFormula(params map[string]interface{}) float64 { return units / DaysInYear(now.Year()) } } + if increment == "hour" { + if interval == "day" { + return units / 24 + } + if interval == "month" { + return units / ( DaysInMonth(now.Year(), now.Month()) * 24 ) + } + if interval == "year" { + return units / ( DaysInYear(now.Year()) * 24 ) + } + } + if increment == "minute" { + if interval == "hour" { + return units / 60 + } + } return 0.0 }