mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-15 21:29:52 +05:00
expiration date for minutebuckets
This commit is contained in:
@@ -21,6 +21,7 @@ package rater
|
||||
import (
|
||||
"math"
|
||||
"sort"
|
||||
"time"
|
||||
)
|
||||
|
||||
type MinuteBucket struct {
|
||||
|
||||
@@ -160,14 +160,22 @@ Splits the given timespan on minute bucket's duration.
|
||||
*/
|
||||
func (ts *TimeSpan) SplitByMinuteBucket(mb *MinuteBucket) (newTs *TimeSpan) {
|
||||
// if mb expired skip it
|
||||
if !mb.ExpirationTime.IsZero() && (ts.TimeStart.Equal(mb.ExpirationTime) || ts.TimeStart.After(mb.ExpirationTime)) {
|
||||
if !mb.ExpirationDate.IsZero() && (ts.TimeStart.Equal(mb.ExpirationDate) || ts.TimeStart.After(mb.ExpirationDate)) {
|
||||
return nil
|
||||
}
|
||||
|
||||
// expiring before time spans end
|
||||
|
||||
if !mb.ExpirationDate.IsZero() && ts.TimeEnd.After(mb.ExpirationDate) {
|
||||
newTs = &TimeSpan{TimeStart: mb.ExpirationDate, TimeEnd: ts.TimeEnd}
|
||||
ts.TimeEnd = mb.ExpirationDate
|
||||
}
|
||||
|
||||
s := ts.GetDuration().Seconds()
|
||||
ts.MinuteInfo = &MinuteInfo{mb.DestinationId, s, mb.Price}
|
||||
if s <= mb.Seconds {
|
||||
mb.Seconds -= s
|
||||
return nil
|
||||
return newTs
|
||||
}
|
||||
secDuration, _ := time.ParseDuration(fmt.Sprintf("%vs", mb.Seconds))
|
||||
|
||||
|
||||
@@ -249,13 +249,83 @@ func TestTimespanSplitByMinuteBucketScarce(t *testing.T) {
|
||||
func TestTimespanSplitByMinuteBucketPlantyExpired(t *testing.T) {
|
||||
t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)
|
||||
t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)
|
||||
mb := &MinuteBucket{Seconds: 180, ExpirationDate: time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)}
|
||||
mb := &MinuteBucket{Seconds: 180, ExpirationDate: time.Date(2013, time.July, 15, 10, 39, 0, 0, time.UTC)}
|
||||
ts := TimeSpan{TimeStart: t1, TimeEnd: t2}
|
||||
newTs := ts.SplitByMinuteBucket(mb)
|
||||
if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 120 {
|
||||
if ts.MinuteInfo != nil {
|
||||
t.Error("Not enough minutes on minute bucket split")
|
||||
}
|
||||
if newTs != nil {
|
||||
t.Error("Bad extra timespan on minute bucket split")
|
||||
}
|
||||
}
|
||||
|
||||
func TestTimespanSplitByMinuteBucketPlantyExpiring(t *testing.T) {
|
||||
t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)
|
||||
t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)
|
||||
mb := &MinuteBucket{Seconds: 180, ExpirationDate: time.Date(2013, time.July, 15, 10, 41, 0, 0, time.UTC)}
|
||||
ts := TimeSpan{TimeStart: t1, TimeEnd: t2}
|
||||
newTs := ts.SplitByMinuteBucket(mb)
|
||||
if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 60 {
|
||||
t.Error("Not enough minutes on minute bucket split")
|
||||
}
|
||||
if newTs == nil || newTs.MinuteInfo != nil {
|
||||
t.Error("Missing extra timespan on minute bucket split")
|
||||
}
|
||||
}
|
||||
|
||||
func TestTimespanSplitByMinuteBucketPlantyExpiringEnd(t *testing.T) {
|
||||
t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)
|
||||
t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)
|
||||
mb := &MinuteBucket{Seconds: 180, ExpirationDate: time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)}
|
||||
ts := TimeSpan{TimeStart: t1, TimeEnd: t2}
|
||||
newTs := ts.SplitByMinuteBucket(mb)
|
||||
if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 120 {
|
||||
t.Error("Not enough minutes on minute bucket split")
|
||||
}
|
||||
if newTs != nil {
|
||||
t.Error("Missing extra timespan on minute bucket split")
|
||||
}
|
||||
}
|
||||
|
||||
func TestTimespanSplitByMinuteBucketScarceExpiringSame(t *testing.T) {
|
||||
t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)
|
||||
t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)
|
||||
mb := &MinuteBucket{Seconds: 120, ExpirationDate: time.Date(2013, time.July, 15, 10, 41, 0, 0, time.UTC)}
|
||||
ts := TimeSpan{TimeStart: t1, TimeEnd: t2}
|
||||
newTs := ts.SplitByMinuteBucket(mb)
|
||||
if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 60 {
|
||||
t.Error("Not enough minutes on minute bucket split")
|
||||
}
|
||||
if newTs == nil || newTs.MinuteInfo != nil {
|
||||
t.Error("Missing extra timespan on minute bucket split")
|
||||
}
|
||||
}
|
||||
|
||||
func TestTimespanSplitByMinuteBucketScarceExpiringDifferentExpFirst(t *testing.T) {
|
||||
t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)
|
||||
t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)
|
||||
mb := &MinuteBucket{Seconds: 140, ExpirationDate: time.Date(2013, time.July, 15, 10, 41, 1, 0, time.UTC)}
|
||||
ts := TimeSpan{TimeStart: t1, TimeEnd: t2}
|
||||
newTs := ts.SplitByMinuteBucket(mb)
|
||||
if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 61 {
|
||||
t.Error("Not enough minutes on minute bucket split: ", ts.MinuteInfo.Quantity)
|
||||
}
|
||||
if newTs == nil || newTs.MinuteInfo != nil {
|
||||
t.Error("Missing extra timespan on minute bucket split")
|
||||
}
|
||||
}
|
||||
|
||||
func TestTimespanSplitByMinuteBucketScarceExpiringDifferentScarceFirst(t *testing.T) {
|
||||
t1 := time.Date(2013, time.July, 15, 10, 40, 0, 0, time.UTC)
|
||||
t2 := time.Date(2013, time.July, 15, 10, 42, 0, 0, time.UTC)
|
||||
mb := &MinuteBucket{Seconds: 61, ExpirationDate: time.Date(2013, time.July, 15, 10, 41, 30, 0, time.UTC)}
|
||||
ts := TimeSpan{TimeStart: t1, TimeEnd: t2}
|
||||
newTs := ts.SplitByMinuteBucket(mb)
|
||||
if ts.MinuteInfo == nil || ts.MinuteInfo.Quantity != 61 {
|
||||
t.Error("Not enough minutes on minute bucket split")
|
||||
}
|
||||
if newTs == nil || newTs.MinuteInfo != nil {
|
||||
t.Error("Missing extra timespan on minute bucket split")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user