fixses and tests for shared balances

This commit is contained in:
Radu Ioan Fericean
2014-02-27 16:54:11 +02:00
parent 49a3df285b
commit 39e93e7fb8
5 changed files with 74 additions and 4 deletions

View File

@@ -21,6 +21,8 @@ package engine
import (
"testing"
"time"
"github.com/cgrates/cgrates/cache2go"
)
var (
@@ -1033,7 +1035,62 @@ func TestAccountRefund(t *testing.T) {
}
func TestDebitShared(t *testing.T) {
cc := &CallCost{
Tenant: "vdf",
TOR: "0",
Direction: OUTBOUND,
Destination: "0723045326",
Timespans: []*TimeSpan{
&TimeSpan{
TimeStart: time.Date(2013, 9, 24, 10, 48, 0, 0, time.UTC),
TimeEnd: time.Date(2013, 9, 24, 10, 49, 0, 0, time.UTC),
CallDuration: 55 * time.Second,
RateInterval: &RateInterval{Rating: &RIRate{Rates: RateGroups{&Rate{GroupIntervalStart: 0, Value: 2, RateIncrement: 10 * time.Second, RateUnit: time.Second}}}},
},
},
deductConnectFee: true,
}
rif := &Account{Id: "rif", BalanceMap: map[string]BalanceChain{
CREDIT + OUTBOUND: BalanceChain{&Balance{Uuid: "moneya", Value: 60, SharedGroup: "SG_TEST"}},
}}
groupie := &Account{Id: "groupie", BalanceMap: map[string]BalanceChain{
CREDIT + OUTBOUND: BalanceChain{&Balance{Uuid: "moneyc", Value: 70, SharedGroup: "SG_TEST"}},
}}
sg := &SharedGroup{Id: "SG_TEST", Members: []string{rif.Id, groupie.Id}, AccountParameters: map[string]*SharingParameters{"*any": &SharingParameters{Strategy: STRATEGY_RANDOM}}}
accountingStorage.SetAccount(groupie)
accountingStorage.SetSharedGroup("SG_TEST", sg)
cache2go.Cache(SHARED_GROUP_PREFIX+"SG_TEST", sg)
err := rif.debitCreditBalance(cc, false)
if err != nil {
t.Error("Error debiting balance: ", err)
}
if rif.BalanceMap[CREDIT+OUTBOUND][0].Value != 0 {
t.Errorf("Error debiting from shared group: %+v", rif.BalanceMap[CREDIT+OUTBOUND][0])
}
groupie, _ = accountingStorage.GetAccount("groupie")
if groupie.BalanceMap[CREDIT+OUTBOUND][0].Value != 10 {
t.Errorf("Error debiting from shared group: %+v", groupie.BalanceMap[CREDIT+OUTBOUND][0])
}
if len(cc.Timespans) != 1 {
t.Errorf("Wrong number of timespans: %v", cc.Timespans)
}
if len(cc.Timespans[0].Increments) != 6 {
t.Errorf("Wrong number of increments: %v", cc.Timespans[0].Increments)
for index, incr := range cc.Timespans[0].Increments {
t.Errorf("I%d: %+v (%+v)", index, incr, incr.BalanceInfo)
}
}
if cc.Timespans[0].Increments[0].BalanceInfo.AccountId != "rif" ||
cc.Timespans[0].Increments[1].BalanceInfo.AccountId != "rif" ||
cc.Timespans[0].Increments[2].BalanceInfo.AccountId != "rif" ||
cc.Timespans[0].Increments[3].BalanceInfo.AccountId != "groupie" ||
cc.Timespans[0].Increments[4].BalanceInfo.AccountId != "groupie" ||
cc.Timespans[0].Increments[5].BalanceInfo.AccountId != "groupie" {
t.Error("Error setting balance id to increment: ", cc.Timespans[0].Increments[0])
}
}
/*********************************** Benchmarks *******************************/

View File

@@ -180,6 +180,7 @@ func (b *Balance) DebitMinutes(cc *CallCost, count bool, ub *Account, moneyBalan
b.Value -= amount
b.Value = utils.Round(b.Value, roundingDecimals, utils.ROUNDING_MIDDLE)
inc.BalanceInfo.MinuteBalanceUuid = b.Uuid
inc.BalanceInfo.AccountId = ub.Id
inc.MinuteInfo = &MinuteInfo{cc.Destination, amount}
inc.Cost = 0
inc.paid = true
@@ -222,6 +223,7 @@ func (b *Balance) DebitMinutes(cc *CallCost, count bool, ub *Account, moneyBalan
moneyBal.Value -= cost
nInc.BalanceInfo.MinuteBalanceUuid = b.Uuid
nInc.BalanceInfo.MoneyBalanceUuid = moneyBal.Uuid
nInc.BalanceInfo.AccountId = ub.Id
nInc.MinuteInfo = &MinuteInfo{newCC.Destination, seconds}
nInc.paid = true
if count {
@@ -287,6 +289,7 @@ func (b *Balance) DebitMoney(cc *CallCost, count bool, ub *Account) error {
b.Value -= amount
b.Value = utils.Round(b.Value, roundingDecimals, utils.ROUNDING_MIDDLE)
increment.BalanceInfo.MoneyBalanceUuid = b.Uuid
increment.BalanceInfo.AccountId = ub.Id
increment.paid = true
if count {
ub.countUnits(&Action{BalanceType: CREDIT, Direction: cc.Direction, Balance: &Balance{Value: amount, DestinationId: cc.Destination}})
@@ -316,6 +319,7 @@ func (b *Balance) DebitMoney(cc *CallCost, count bool, ub *Account) error {
b.Value -= amount
b.Value = utils.Round(b.Value, roundingDecimals, utils.ROUNDING_MIDDLE)
nInc.BalanceInfo.MoneyBalanceUuid = b.Uuid
nInc.BalanceInfo.AccountId = ub.Id
nInc.paid = true
if count {
ub.countUnits(&Action{BalanceType: CREDIT, Direction: newCC.Direction, Balance: &Balance{Value: amount, DestinationId: newCC.Destination}})

View File

@@ -22,6 +22,8 @@ import (
"math"
"math/rand"
"time"
"github.com/cgrates/cgrates/utils"
)
const (
@@ -59,8 +61,15 @@ func (sg *SharedGroup) PopBalanceByStrategy(account string, balanceChain *Balanc
return
}
index := 0
sharingParameters := sg.AccountParameters[account]
switch sharingParameters.Strategy {
sharingParameters := sg.AccountParameters[utils.ANY]
if sp, hasParamsForAccount := sg.AccountParameters[account]; hasParamsForAccount {
sharingParameters = sp
}
strategy := STRATEGY_RANDOM
if sharingParameters != nil {
strategy = sharingParameters.Strategy
}
switch strategy {
case STRATEGY_RANDOM:
rand.Seed(time.Now().Unix())
index = rand.Intn(len(bc))

View File

@@ -278,7 +278,7 @@ func (ms *MapStorage) GetSharedGroup(key string, checkDb bool) (sg *SharedGroup,
func (ms *MapStorage) SetSharedGroup(key string, sg *SharedGroup) (err error) {
result, err := ms.ms.Marshal(sg)
ms.dict[SHARED_GROUP_PREFIX+key] = result
//cache2go.Cache(ACTION_PREFIX+key, sg)
//cache2go.Cache(SHARED_GROUP_PREFIX+key, sg)
return
}

View File

@@ -59,7 +59,7 @@ type MinuteInfo struct {
type BalanceInfo struct {
MinuteBalanceUuid string
MoneyBalanceUuid string
UserBalanceId string // used when debited from shared balance
AccountId string // used when debited from shared balance
}
type TimeSpans []*TimeSpan