mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-14 20:59:53 +05:00
counter for minutes
This commit is contained in:
@@ -330,7 +330,7 @@ func (cd *CallDescriptor) Debit() (cc *CallCost, err error) {
|
||||
}
|
||||
for _, ts := range cc.Timespans {
|
||||
if ts.MinuteInfo != nil {
|
||||
userBalance.debitMinutesBalance(ts.MinuteInfo.Quantity, cd.Destination)
|
||||
userBalance.debitMinutesBalance(ts.MinuteInfo.Quantity, cd.Destination, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -374,7 +374,7 @@ func (cd *CallDescriptor) DebitSeconds() (err error) {
|
||||
defer userBalancesRWMutex.Unlock()
|
||||
if userBalance, err := cd.getUserBalance(); err == nil && userBalance != nil {
|
||||
defer storageGetter.SetUserBalance(userBalance)
|
||||
return userBalance.debitMinutesBalance(cd.Amount, cd.Destination)
|
||||
return userBalance.debitMinutesBalance(cd.Amount, cd.Destination, true)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -138,10 +138,10 @@ All the appropriate buckets will be debited until all amount of minutes is consu
|
||||
If the amount is bigger than the sum of all seconds in the minute buckets than nothing will be
|
||||
debited and an error will be returned.
|
||||
*/
|
||||
func (ub *UserBalance) debitMinutesBalance(amount float64, prefix string) error {
|
||||
// if count && amount > 0 {
|
||||
// ub.countUnits(&Action{BalanceId: TRAFFIC_TIME, Units: amount})
|
||||
// }
|
||||
func (ub *UserBalance) debitMinutesBalance(amount float64, prefix string, count bool) error {
|
||||
if count && amount > 0 {
|
||||
ub.countUnits(&Action{BalanceId: MINUTES, MinuteBucket: &MinuteBucket{Seconds: amount, DestinationId: prefix}})
|
||||
}
|
||||
avaliableNbSeconds, _, bucketList := ub.getSecondsForPrefix(prefix)
|
||||
if avaliableNbSeconds < amount {
|
||||
return new(AmountTooBig)
|
||||
|
||||
@@ -171,7 +171,7 @@ func TestDebitMinuteBalance(t *testing.T) {
|
||||
b1 := &MinuteBucket{Seconds: 10, Weight: 10, Price: 0.0, DestinationId: "NAT"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Weight: 20, Price: 0.0, DestinationId: "RET"}
|
||||
rifsBalance := &UserBalance{Id: "other", MinuteBuckets: []*MinuteBucket{b1, b2}, BalanceMap: map[string]float64{CREDIT: 21}}
|
||||
err := rifsBalance.debitMinutesBalance(6, "0723")
|
||||
err := rifsBalance.debitMinutesBalance(6, "0723", false)
|
||||
if b2.Seconds != 94 || err != nil {
|
||||
t.Log(err)
|
||||
t.Errorf("Expected %v was %v", 94, b2.Seconds)
|
||||
@@ -182,7 +182,7 @@ func TestDebitMultipleBucketsMinuteBalance(t *testing.T) {
|
||||
b1 := &MinuteBucket{Seconds: 10, Weight: 10, Price: 0.0, DestinationId: "NAT"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Weight: 20, Price: 0.0, DestinationId: "RET"}
|
||||
rifsBalance := &UserBalance{Id: "other", MinuteBuckets: []*MinuteBucket{b1, b2}, BalanceMap: map[string]float64{CREDIT: 21}}
|
||||
err := rifsBalance.debitMinutesBalance(105, "0723")
|
||||
err := rifsBalance.debitMinutesBalance(105, "0723", false)
|
||||
if b2.Seconds != 0 || b1.Seconds != 5 || err != nil {
|
||||
t.Log(err)
|
||||
t.Errorf("Expected %v was %v", 0, b2.Seconds)
|
||||
@@ -193,7 +193,7 @@ func TestDebitAllMinuteBalance(t *testing.T) {
|
||||
b1 := &MinuteBucket{Seconds: 10, Weight: 10, Price: 0.0, DestinationId: "NAT"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Weight: 20, Price: 0.0, DestinationId: "RET"}
|
||||
rifsBalance := &UserBalance{Id: "other", MinuteBuckets: []*MinuteBucket{b1, b2}, BalanceMap: map[string]float64{CREDIT: 21}}
|
||||
err := rifsBalance.debitMinutesBalance(110, "0723")
|
||||
err := rifsBalance.debitMinutesBalance(110, "0723", false)
|
||||
if b2.Seconds != 0 || b1.Seconds != 0 || err != nil {
|
||||
t.Errorf("Expected %v was %v", 0, b2.Seconds)
|
||||
}
|
||||
@@ -203,7 +203,7 @@ func TestDebitMoreMinuteBalance(t *testing.T) {
|
||||
b1 := &MinuteBucket{Seconds: 10, Weight: 10, Price: 0.0, DestinationId: "NAT"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Weight: 20, Price: 0.0, DestinationId: "RET"}
|
||||
rifsBalance := &UserBalance{Id: "other", MinuteBuckets: []*MinuteBucket{b1, b2}, BalanceMap: map[string]float64{CREDIT: 21}}
|
||||
err := rifsBalance.debitMinutesBalance(115, "0723")
|
||||
err := rifsBalance.debitMinutesBalance(115, "0723", false)
|
||||
if b2.Seconds != 100 || b1.Seconds != 10 || err == nil {
|
||||
t.Errorf("Expected %v was %v", 1000, b2.Seconds)
|
||||
}
|
||||
@@ -213,7 +213,7 @@ func TestDebitPriceMinuteBalance0(t *testing.T) {
|
||||
b1 := &MinuteBucket{Seconds: 10, Weight: 10, Price: 0.0, DestinationId: "NAT"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Weight: 20, Price: 1.0, DestinationId: "RET"}
|
||||
rifsBalance := &UserBalance{Id: "other", MinuteBuckets: []*MinuteBucket{b1, b2}, BalanceMap: map[string]float64{CREDIT: 21}}
|
||||
err := rifsBalance.debitMinutesBalance(5, "0723")
|
||||
err := rifsBalance.debitMinutesBalance(5, "0723", false)
|
||||
if b2.Seconds != 95 || b1.Seconds != 10 || err != nil || rifsBalance.BalanceMap[CREDIT] != 16 {
|
||||
t.Errorf("Expected %v was %v", 16, rifsBalance.BalanceMap[CREDIT])
|
||||
}
|
||||
@@ -223,7 +223,7 @@ func TestDebitPriceAllMinuteBalance(t *testing.T) {
|
||||
b1 := &MinuteBucket{Seconds: 10, Weight: 10, Price: 0.0, DestinationId: "NAT"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Weight: 20, Price: 1.0, DestinationId: "RET"}
|
||||
rifsBalance := &UserBalance{Id: "other", MinuteBuckets: []*MinuteBucket{b1, b2}, BalanceMap: map[string]float64{CREDIT: 21}}
|
||||
err := rifsBalance.debitMinutesBalance(21, "0723")
|
||||
err := rifsBalance.debitMinutesBalance(21, "0723", false)
|
||||
if b2.Seconds != 79 || b1.Seconds != 10 || err != nil || rifsBalance.BalanceMap[CREDIT] != 0 {
|
||||
t.Errorf("Expected %v was %v", 0, rifsBalance.BalanceMap[CREDIT])
|
||||
}
|
||||
@@ -233,7 +233,7 @@ func TestDebitPriceMoreMinuteBalance(t *testing.T) {
|
||||
b1 := &MinuteBucket{Seconds: 10, Weight: 10, Price: 0.0, DestinationId: "NAT"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Weight: 20, Price: 1.0, DestinationId: "RET"}
|
||||
rifsBalance := &UserBalance{Id: "other", MinuteBuckets: []*MinuteBucket{b1, b2}, BalanceMap: map[string]float64{CREDIT: 21}}
|
||||
err := rifsBalance.debitMinutesBalance(25, "0723")
|
||||
err := rifsBalance.debitMinutesBalance(25, "0723", false)
|
||||
if b2.Seconds != 100 || b1.Seconds != 10 || err == nil || rifsBalance.BalanceMap[CREDIT] != 21 {
|
||||
t.Log(b1, b2, err)
|
||||
t.Errorf("Expected %v was %v", 21, rifsBalance.BalanceMap[CREDIT])
|
||||
@@ -244,7 +244,7 @@ func TestDebitPriceNegativeMinuteBalance(t *testing.T) {
|
||||
b1 := &MinuteBucket{Seconds: 10, Weight: 10, Price: 0.0, DestinationId: "NAT"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Weight: 20, Price: 1.0, DestinationId: "RET"}
|
||||
rifsBalance := &UserBalance{Id: "other", MinuteBuckets: []*MinuteBucket{b1, b2}, BalanceMap: map[string]float64{CREDIT: 21}}
|
||||
err := rifsBalance.debitMinutesBalance(-15, "0723")
|
||||
err := rifsBalance.debitMinutesBalance(-15, "0723", false)
|
||||
if b2.Seconds != 115 || b1.Seconds != 10 || err != nil || rifsBalance.BalanceMap[CREDIT] != 36 {
|
||||
t.Log(b1, b2, err)
|
||||
t.Errorf("Expected %v was %v", 36, rifsBalance.BalanceMap[CREDIT])
|
||||
@@ -255,7 +255,7 @@ func TestDebitNegativeMinuteBalance(t *testing.T) {
|
||||
b1 := &MinuteBucket{Seconds: 10, Weight: 10, Price: 0.0, DestinationId: "NAT"}
|
||||
b2 := &MinuteBucket{Seconds: 100, Weight: 20, Price: 0.0, DestinationId: "RET"}
|
||||
rifsBalance := &UserBalance{Id: "other", MinuteBuckets: []*MinuteBucket{b1, b2}, BalanceMap: map[string]float64{CREDIT: 21}}
|
||||
err := rifsBalance.debitMinutesBalance(-15, "0723")
|
||||
err := rifsBalance.debitMinutesBalance(-15, "0723", false)
|
||||
if b2.Seconds != 115 || b1.Seconds != 10 || err != nil || rifsBalance.BalanceMap[CREDIT] != 21 {
|
||||
t.Log(b1, b2, err)
|
||||
t.Errorf("Expected %v was %v", 21, rifsBalance.BalanceMap[CREDIT])
|
||||
@@ -302,7 +302,7 @@ func TestDebitNegativeSMSBalance(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestUserBalanceAddMinuteBucket(t *testing.T) {
|
||||
func TestUserBalancedebitMinuteBucket(t *testing.T) {
|
||||
ub := &UserBalance{
|
||||
Id: "rif",
|
||||
Type: UB_TYPE_POSTPAID,
|
||||
@@ -310,13 +310,13 @@ func TestUserBalanceAddMinuteBucket(t *testing.T) {
|
||||
MinuteBuckets: []*MinuteBucket{&MinuteBucket{Weight: 20, Price: 1, DestinationId: "NAT"}, &MinuteBucket{Weight: 10, Price: 10, Percent: 0, DestinationId: "RET"}},
|
||||
}
|
||||
newMb := &MinuteBucket{Weight: 20, Price: 1, DestinationId: "NEW"}
|
||||
ub.addMinuteBucket(newMb)
|
||||
ub.debitMinuteBucket(newMb)
|
||||
if len(ub.MinuteBuckets) != 3 || ub.MinuteBuckets[2] != newMb {
|
||||
t.Error("Error adding minute bucket!", len(ub.MinuteBuckets), ub.MinuteBuckets)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUserBalanceAddMinuteBucketExists(t *testing.T) {
|
||||
func TestUserBalancedebitMinuteBucketExists(t *testing.T) {
|
||||
|
||||
ub := &UserBalance{
|
||||
Id: "rif",
|
||||
@@ -324,8 +324,8 @@ func TestUserBalanceAddMinuteBucketExists(t *testing.T) {
|
||||
BalanceMap: map[string]float64{SMS: 14, TRAFFIC: 1024},
|
||||
MinuteBuckets: []*MinuteBucket{&MinuteBucket{Seconds: 15, Weight: 20, Price: 1, DestinationId: "NAT"}, &MinuteBucket{Weight: 10, Price: 10, Percent: 0, DestinationId: "RET"}},
|
||||
}
|
||||
newMb := &MinuteBucket{Seconds: 10, Weight: 20, Price: 1, DestinationId: "NAT"}
|
||||
ub.addMinuteBucket(newMb)
|
||||
newMb := &MinuteBucket{Seconds: -10, Weight: 20, Price: 1, DestinationId: "NAT"}
|
||||
ub.debitMinuteBucket(newMb)
|
||||
if len(ub.MinuteBuckets) != 2 || ub.MinuteBuckets[0].Seconds != 25 {
|
||||
t.Error("Error adding minute bucket!")
|
||||
}
|
||||
@@ -338,26 +338,26 @@ func TestUserBalanceAddMinuteNil(t *testing.T) {
|
||||
BalanceMap: map[string]float64{SMS: 14, TRAFFIC: 1024},
|
||||
MinuteBuckets: []*MinuteBucket{&MinuteBucket{Weight: 20, Price: 1, DestinationId: "NAT"}, &MinuteBucket{Weight: 10, Price: 10, Percent: 0, DestinationId: "RET"}},
|
||||
}
|
||||
ub.addMinuteBucket(nil)
|
||||
ub.debitMinuteBucket(nil)
|
||||
if len(ub.MinuteBuckets) != 2 {
|
||||
t.Error("Error adding minute bucket!")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUserBalanceAddMinutBucketEmpty(t *testing.T) {
|
||||
mb1 := &MinuteBucket{Seconds: 10, DestinationId: "NAT"}
|
||||
mb2 := &MinuteBucket{Seconds: 10, DestinationId: "NAT"}
|
||||
mb3 := &MinuteBucket{Seconds: 10, DestinationId: "OTHER"}
|
||||
mb1 := &MinuteBucket{Seconds: -10, DestinationId: "NAT"}
|
||||
mb2 := &MinuteBucket{Seconds: -10, DestinationId: "NAT"}
|
||||
mb3 := &MinuteBucket{Seconds: -10, DestinationId: "OTHER"}
|
||||
ub := &UserBalance{}
|
||||
ub.addMinuteBucket(mb1)
|
||||
ub.debitMinuteBucket(mb1)
|
||||
if len(ub.MinuteBuckets) != 1 {
|
||||
t.Error("Error adding minute bucket: ", ub.MinuteBuckets)
|
||||
}
|
||||
ub.addMinuteBucket(mb2)
|
||||
ub.debitMinuteBucket(mb2)
|
||||
if len(ub.MinuteBuckets) != 1 || ub.MinuteBuckets[0].Seconds != 20 {
|
||||
t.Error("Error adding minute bucket: ", ub.MinuteBuckets)
|
||||
}
|
||||
ub.addMinuteBucket(mb3)
|
||||
ub.debitMinuteBucket(mb3)
|
||||
if len(ub.MinuteBuckets) != 2 {
|
||||
t.Error("Error adding minute bucket: ", ub.MinuteBuckets)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user