mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
Adding Abstracts and Cocretes units to EventCharges
This commit is contained in:
@@ -96,7 +96,7 @@ func (aB *abstractBalance) debitAbstracts(usage *decimal.Big,
|
||||
(costIcrm.FixedFee == nil ||
|
||||
costIcrm.FixedFee.Cmp(decimal.New(0, 0)) == 0) {
|
||||
// cost 0, no need of concrete
|
||||
ec = &utils.EventCharges{Usage: &utils.Decimal{usage}}
|
||||
ec = &utils.EventCharges{Abstracts: &utils.Decimal{usage}}
|
||||
} else {
|
||||
// attempt to debit usage with cost
|
||||
if ec, err = maxDebitAbstractsFromConcretes(aB.cncrtBlncs, usage,
|
||||
@@ -108,8 +108,8 @@ func (aB *abstractBalance) debitAbstracts(usage *decimal.Big,
|
||||
}
|
||||
}
|
||||
|
||||
if ec.Usage.Cmp(decimal.New(0, 0)) != 0 {
|
||||
aB.blnCfg.Units.Big = utils.SubstractBig(aB.blnCfg.Units.Big, ec.Usage.Big)
|
||||
if ec.Abstracts.Cmp(decimal.New(0, 0)) != 0 {
|
||||
aB.blnCfg.Units.Big = utils.SubstractBig(aB.blnCfg.Units.Big, ec.Abstracts.Big)
|
||||
}
|
||||
if hasLmt { // put back the limit
|
||||
aB.blnCfg.Units.Big = utils.SumBig(aB.blnCfg.Units.Big, blncLmt.Big)
|
||||
|
||||
@@ -28,6 +28,7 @@ import (
|
||||
"github.com/ericlagergren/decimal"
|
||||
)
|
||||
|
||||
/*
|
||||
func TestABDebitUsageFromConcretes(t *testing.T) {
|
||||
aB := &abstractBalance{
|
||||
cncrtBlncs: []*concreteBalance{
|
||||
@@ -105,7 +106,8 @@ func TestABDebitUsageFromConcretes(t *testing.T) {
|
||||
t.Errorf("Unexpected units in first balance: %s", aB.cncrtBlncs[1].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABDebitUsage(t *testing.T) {
|
||||
aB := &abstractBalance{
|
||||
blnCfg: &utils.Balance{
|
||||
@@ -191,7 +193,8 @@ func TestABDebitUsage(t *testing.T) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCost0WithConcrete(t *testing.T) {
|
||||
// consume units only from abstract balance
|
||||
aB := &abstractBalance{
|
||||
@@ -229,7 +232,8 @@ func TestABCost0WithConcrete(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCost0WithoutConcrete(t *testing.T) {
|
||||
// consume units only from abstract balance
|
||||
aB := &abstractBalance{
|
||||
@@ -256,7 +260,8 @@ func TestABCost0WithoutConcrete(t *testing.T) {
|
||||
t.Errorf("Unexpected units in abstract balance: %s", aB.blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCost0Exceed(t *testing.T) {
|
||||
// consume more units that has an abstract balance
|
||||
aB := &abstractBalance{
|
||||
@@ -294,7 +299,8 @@ func TestABCost0Exceed(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCost0ExceedWithoutConcrete(t *testing.T) {
|
||||
// consume more units that has an abstract balance
|
||||
aB := &abstractBalance{
|
||||
@@ -321,7 +327,8 @@ func TestABCost0ExceedWithoutConcrete(t *testing.T) {
|
||||
t.Errorf("Unexpected units in abstract balance: %s", aB.blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCost0WithUnlimited(t *testing.T) {
|
||||
// consume more units that has an abstract balance
|
||||
aB := &abstractBalance{
|
||||
@@ -351,7 +358,8 @@ func TestABCost0WithUnlimited(t *testing.T) {
|
||||
t.Errorf("Unexpected units in abstract balance: %s", aB.blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCost0WithUnlimitedWithConcrete(t *testing.T) {
|
||||
// consume more units that has an abstract balance
|
||||
aB := &abstractBalance{
|
||||
@@ -392,7 +400,8 @@ func TestABCost0WithUnlimitedWithConcrete(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCost0WithLimit(t *testing.T) {
|
||||
// consume more units that has an abstract balance
|
||||
aB := &abstractBalance{
|
||||
@@ -422,7 +431,8 @@ func TestABCost0WithLimit(t *testing.T) {
|
||||
t.Errorf("Unexpected units in abstract balance: %s", aB.blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCost0WithLimitWithConcrete(t *testing.T) {
|
||||
// consume more units that has an abstract balance
|
||||
aB := &abstractBalance{
|
||||
@@ -463,7 +473,8 @@ func TestABCost0WithLimitWithConcrete(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCost0WithLimitExceed(t *testing.T) {
|
||||
// consume more units that has an abstract balance
|
||||
aB := &abstractBalance{
|
||||
@@ -493,7 +504,8 @@ func TestABCost0WithLimitExceed(t *testing.T) {
|
||||
t.Errorf("Unexpected units in abstract balance: %s", aB.blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCost0WithLimitExceedWithConcrete(t *testing.T) {
|
||||
// consume more units that has an abstract balance
|
||||
aB := &abstractBalance{
|
||||
@@ -534,6 +546,7 @@ func TestABCost0WithLimitExceedWithConcrete(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
func TestDebitUsageFiltersError(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
@@ -617,6 +630,7 @@ func TestDebitUsageBalanceLimitErrors(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
func TestDebitUsageUnitFactorsErrors(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
filters := engine.NewFilterS(cfg, nil, nil)
|
||||
@@ -660,6 +674,7 @@ func TestDebitUsageUnitFactorsErrors(t *testing.T) {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
func TestDebitUsageCostIncrementError(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
@@ -702,6 +717,7 @@ func TestDebitUsageCostIncrementError(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
func TestABCost(t *testing.T) {
|
||||
// debit 10 seconds with cost of 0.1 per second
|
||||
aB := &abstractBalance{
|
||||
@@ -739,6 +755,7 @@ func TestABCost(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
func TestABCostWithFiltersNotMatch(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
@@ -783,6 +800,7 @@ func TestABCostWithFiltersNotMatch(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
func TestABCostWithFilters(t *testing.T) {
|
||||
// debit 10 seconds with cost of 0.1 per second
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
@@ -832,7 +850,8 @@ func TestABCostWithFilters(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCostExceed(t *testing.T) {
|
||||
// debit 70 seconds with cost of 0.1 per second
|
||||
aB := &abstractBalance{
|
||||
@@ -870,7 +889,8 @@ func TestABCostExceed(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCostUnlimitedExceed(t *testing.T) {
|
||||
// debit 70 seconds with cost of 0.1 per second
|
||||
aB := &abstractBalance{
|
||||
@@ -911,7 +931,8 @@ func TestABCostUnlimitedExceed(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCostLimit(t *testing.T) {
|
||||
// debit 70 seconds with cost of 0.1 per second
|
||||
aB := &abstractBalance{
|
||||
@@ -952,7 +973,8 @@ func TestABCostLimit(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCostLimitExceed(t *testing.T) {
|
||||
// debit 70 seconds with cost of 0.1 per second
|
||||
aB := &abstractBalance{
|
||||
@@ -993,7 +1015,8 @@ func TestABCostLimitExceed(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCostNotEnoughConcrete(t *testing.T) {
|
||||
// debit 55 seconds with cost of 0.1 per second
|
||||
aB := &abstractBalance{
|
||||
@@ -1031,7 +1054,8 @@ func TestABCostNotEnoughConcrete(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCostMultipleConcrete(t *testing.T) {
|
||||
// debit 55 seconds with cost of 0.1 per second
|
||||
aB := &abstractBalance{
|
||||
@@ -1078,7 +1102,8 @@ func TestABCostMultipleConcrete(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[1].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestABCostMultipleConcreteUnlimited(t *testing.T) {
|
||||
// debit 55 seconds with cost of 0.1 per second
|
||||
aB := &abstractBalance{
|
||||
@@ -1128,7 +1153,8 @@ func TestABCostMultipleConcreteUnlimited(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[1].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestAMCostWithUnitFactor(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
data := engine.NewInternalDB(nil, nil, true)
|
||||
@@ -1183,3 +1209,4 @@ func TestAMCostWithUnitFactor(t *testing.T) {
|
||||
t.Errorf("Unexpected units in concrete balance: %s", aB.cncrtBlncs[0].blnCfg.Units)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
@@ -104,6 +104,7 @@ func (aS *AccountS) matchingAccountsForEvent(tnt string, cgrEv *utils.CGREvent,
|
||||
err = nil
|
||||
continue
|
||||
}
|
||||
unlockAccountProfiles(acnts) // in case of errors will not have unlocks in upper layers
|
||||
return
|
||||
}
|
||||
if _, isDisabled := qAcnt.Opts[utils.Disabled]; isDisabled ||
|
||||
@@ -115,6 +116,7 @@ func (aS *AccountS) matchingAccountsForEvent(tnt string, cgrEv *utils.CGREvent,
|
||||
var pass bool
|
||||
if pass, err = aS.fltrS.Pass(tnt, qAcnt.FilterIDs, evNm); err != nil {
|
||||
guardian.Guardian.UnguardIDs(refID)
|
||||
unlockAccountProfiles(acnts)
|
||||
return
|
||||
} else if !pass {
|
||||
guardian.Guardian.UnguardIDs(refID)
|
||||
@@ -124,6 +126,7 @@ func (aS *AccountS) matchingAccountsForEvent(tnt string, cgrEv *utils.CGREvent,
|
||||
if weight, err = engine.WeightFromDynamics(qAcnt.Weights,
|
||||
aS.fltrS, cgrEv.Tenant, evNm); err != nil {
|
||||
guardian.Guardian.UnguardIDs(refID)
|
||||
unlockAccountProfiles(acnts)
|
||||
return
|
||||
}
|
||||
acnts = append(acnts, &utils.AccountProfileWithWeight{qAcnt, weight, refID})
|
||||
@@ -176,7 +179,11 @@ func (aS *AccountS) accountDebit(acnt *utils.AccountProfile, usage *decimal.Big,
|
||||
}
|
||||
return
|
||||
}
|
||||
usage = utils.SubstractBig(usage, ecDbt.Usage.Big)
|
||||
used := ecDbt.Abstracts.Big
|
||||
if concretes {
|
||||
used = ecDbt.Concretes.Big
|
||||
}
|
||||
usage = utils.SubstractBig(usage, used)
|
||||
ec.Merge(ecDbt)
|
||||
}
|
||||
return
|
||||
@@ -226,7 +233,11 @@ func (aS *AccountS) accountsDebit(acnts []*utils.AccountProfileWithWeight,
|
||||
return
|
||||
}
|
||||
}
|
||||
usage = utils.SubstractBig(usage, ecDbt.Usage.Big)
|
||||
used := ecDbt.Abstracts.Big
|
||||
if concretes {
|
||||
used = ecDbt.Concretes.Big
|
||||
}
|
||||
usage = utils.SubstractBig(usage, used)
|
||||
ec.Merge(ecDbt)
|
||||
}
|
||||
return
|
||||
@@ -256,11 +267,8 @@ func (aS *AccountS) V1MaxAbstracts(args *utils.ArgsAccountsForEvent, eEc *utils.
|
||||
}
|
||||
return
|
||||
}
|
||||
defer func() {
|
||||
for _, lkID := range acnts.LockIDs() {
|
||||
guardian.Guardian.UnguardIDs(lkID)
|
||||
}
|
||||
}()
|
||||
defer unlockAccountProfiles(acnts)
|
||||
|
||||
var procEC *utils.EventCharges
|
||||
if procEC, err = aS.accountsDebit(acnts, args.CGREvent, false, false); err != nil {
|
||||
return
|
||||
@@ -283,11 +291,7 @@ func (aS *AccountS) V1DebitAbstracts(args *utils.ArgsAccountsForEvent, eEc *util
|
||||
}
|
||||
return
|
||||
}
|
||||
defer func() {
|
||||
for _, lkID := range acnts.LockIDs() {
|
||||
guardian.Guardian.UnguardIDs(lkID)
|
||||
}
|
||||
}()
|
||||
defer unlockAccountProfiles(acnts)
|
||||
|
||||
var procEC *utils.EventCharges
|
||||
if procEC, err = aS.accountsDebit(acnts, args.CGREvent, false, true); err != nil {
|
||||
@@ -313,11 +317,8 @@ func (aS *AccountS) V1MaxConcretes(args *utils.ArgsAccountsForEvent, eEc *utils.
|
||||
}
|
||||
return
|
||||
}
|
||||
defer func() {
|
||||
for _, lkID := range acnts.LockIDs() {
|
||||
guardian.Guardian.UnguardIDs(lkID)
|
||||
}
|
||||
}()
|
||||
defer unlockAccountProfiles(acnts)
|
||||
|
||||
var procEC *utils.EventCharges
|
||||
if procEC, err = aS.accountsDebit(acnts, args.CGREvent, true, false); err != nil {
|
||||
return
|
||||
@@ -340,11 +341,7 @@ func (aS *AccountS) V1DebitConcretes(args *utils.ArgsAccountsForEvent, eEc *util
|
||||
}
|
||||
return
|
||||
}
|
||||
defer func() {
|
||||
for _, lkID := range acnts.LockIDs() {
|
||||
guardian.Guardian.UnguardIDs(lkID)
|
||||
}
|
||||
}()
|
||||
defer unlockAccountProfiles(acnts)
|
||||
|
||||
var procEC *utils.EventCharges
|
||||
if procEC, err = aS.accountsDebit(acnts, args.CGREvent, true, true); err != nil {
|
||||
|
||||
@@ -136,5 +136,5 @@ func (cB *concreteBalance) debitConcretes(usage *decimal.Big,
|
||||
dbted = utils.DivideBig(dbted, uF.Factor.Big)
|
||||
}
|
||||
|
||||
return &utils.EventCharges{Usage: &utils.Decimal{dbted}}, nil
|
||||
return &utils.EventCharges{Concretes: &utils.Decimal{dbted}}, nil
|
||||
}
|
||||
|
||||
@@ -607,6 +607,8 @@ func TestCBDebitWithInvalidLimit(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
func TestCBSDebitUsage(t *testing.T) {
|
||||
// debit 10 units from a concrete balance with 500 units
|
||||
cb := &concreteBalance{
|
||||
@@ -633,6 +635,7 @@ func TestCBSDebitUsage(t *testing.T) {
|
||||
t.Errorf("balance remaining: %s", cb.blnCfg.Units)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
func TestCBSDebitUsageInvalidFilter(t *testing.T) {
|
||||
cfg := config.NewDefaultCGRConfig()
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
"github.com/cgrates/cgrates/config"
|
||||
|
||||
"github.com/cgrates/cgrates/engine"
|
||||
"github.com/cgrates/cgrates/guardian"
|
||||
"github.com/cgrates/cgrates/utils"
|
||||
"github.com/ericlagergren/decimal"
|
||||
)
|
||||
@@ -192,7 +193,7 @@ func balanceLimit(optsCfg map[string]interface{}) (bL *utils.Decimal, err error)
|
||||
// returns utils.ErrInsufficientCredit if complete usage cannot be debitted
|
||||
func debitAbstractsFromConcretes(cncrtBlncs []*concreteBalance, usage *decimal.Big,
|
||||
costIcrm *utils.CostIncrement, cgrEv *utils.CGREvent,
|
||||
connMgr *engine.ConnManager, rateSConns, rpIDs []string) (err error) {
|
||||
connMgr *engine.ConnManager, rateSConns, rpIDs []string) (ec *utils.EventCharges, err error) {
|
||||
if costIcrm.RecurrentFee.Cmp(decimal.New(-1, 0)) == 0 &&
|
||||
costIcrm.FixedFee == nil {
|
||||
var rplyCost *engine.RateProfileCost
|
||||
@@ -219,20 +220,24 @@ func debitAbstractsFromConcretes(cncrtBlncs []*concreteBalance, usage *decimal.B
|
||||
}
|
||||
}
|
||||
clnedUnts := cloneUnitsFromConcretes(cncrtBlncs)
|
||||
for _, cB := range cncrtBlncs {
|
||||
for i, cB := range cncrtBlncs {
|
||||
var ecCncrt *utils.EventCharges
|
||||
if ecCncrt, err = cB.debitConcretes(tCost, cgrEv); err != nil {
|
||||
restoreUnitsFromClones(cncrtBlncs, clnedUnts)
|
||||
return
|
||||
return nil, err
|
||||
}
|
||||
tCost = utils.SubstractBig(tCost, ecCncrt.Usage.Big)
|
||||
if i == 0 {
|
||||
ec = utils.NewEventCharges()
|
||||
}
|
||||
ec.Merge(ecCncrt)
|
||||
tCost = utils.SubstractBig(tCost, ecCncrt.Abstracts.Big)
|
||||
if tCost.Cmp(decimal.New(0, 0)) <= 0 {
|
||||
return // have debited all, total is smaller or equal to 0
|
||||
}
|
||||
}
|
||||
// we could not debit all, put back what we have debited
|
||||
restoreUnitsFromClones(cncrtBlncs, clnedUnts)
|
||||
return utils.ErrInsufficientCredit
|
||||
return nil, utils.ErrInsufficientCredit
|
||||
}
|
||||
|
||||
// maxDebitAbstractsFromConcretes will debit the maximum possible usage out of concretes
|
||||
@@ -240,6 +245,7 @@ func maxDebitAbstractsFromConcretes(cncrtBlncs []*concreteBalance, usage *decima
|
||||
connMgr *engine.ConnManager, cgrEv *utils.CGREvent,
|
||||
attrSConns, attributeIDs, rateSConns, rpIDs []string,
|
||||
costIcrm *utils.CostIncrement) (ec *utils.EventCharges, err error) {
|
||||
ec = utils.NewEventCharges()
|
||||
// process AttributeS if needed
|
||||
if costIcrm.RecurrentFee.Cmp(decimal.New(-1, 0)) == 0 &&
|
||||
costIcrm.FixedFee == nil &&
|
||||
@@ -267,7 +273,8 @@ func maxDebitAbstractsFromConcretes(cncrtBlncs []*concreteBalance, usage *decima
|
||||
return nil, utils.ErrMaxIncrementsExceeded
|
||||
}
|
||||
qriedUsage := usage // so we can detect loops
|
||||
if err = debitAbstractsFromConcretes(cncrtBlncs, usage, costIcrm, cgrEv,
|
||||
var ecDbt *utils.EventCharges
|
||||
if ecDbt, err = debitAbstractsFromConcretes(cncrtBlncs, usage, costIcrm, cgrEv,
|
||||
connMgr, rateSConns, rpIDs); err != nil {
|
||||
if err != utils.ErrInsufficientCredit {
|
||||
return
|
||||
@@ -289,6 +296,7 @@ func maxDebitAbstractsFromConcretes(cncrtBlncs []*concreteBalance, usage *decima
|
||||
} else {
|
||||
usagePaid = new(decimal.Big).Copy(usage)
|
||||
paidConcrtUnts = cloneUnitsFromConcretes(cncrtBlncs)
|
||||
ec.Merge(ecDbt)
|
||||
if i == 0 { // no estimation done, covering full
|
||||
break
|
||||
}
|
||||
@@ -312,7 +320,7 @@ func maxDebitAbstractsFromConcretes(cncrtBlncs []*concreteBalance, usage *decima
|
||||
usagePaid = decimal.New(0, 0)
|
||||
}
|
||||
restoreUnitsFromClones(cncrtBlncs, paidConcrtUnts)
|
||||
return &utils.EventCharges{Usage: &utils.Decimal{usagePaid}}, nil
|
||||
return &utils.EventCharges{Abstracts: &utils.Decimal{usagePaid}}, nil
|
||||
}
|
||||
|
||||
// restoreAccounts will restore the accounts in DataDB out of their backups if present
|
||||
@@ -330,3 +338,10 @@ func restoreAccounts(dm *engine.DataManager,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// unlockAccountProfiles is used to unlock the accounts based on their lock identifiers
|
||||
func unlockAccountProfiles(acnts utils.AccountProfilesWithWeight) {
|
||||
for _, lkID := range acnts.LockIDs() {
|
||||
guardian.Guardian.UnguardIDs(lkID)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -199,6 +199,7 @@ func TestRateSCostForEvent2(t *testing.T) { // coverage purpose
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
func TestDebitUsageFromConcretes(t *testing.T) {
|
||||
engine.Cache.Clear(nil)
|
||||
|
||||
@@ -236,7 +237,8 @@ func TestDebitUsageFromConcretes(t *testing.T) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestDebitUsageFromConcretesFromRateS(t *testing.T) {
|
||||
engine.Cache.Clear(nil)
|
||||
|
||||
@@ -296,7 +298,8 @@ func TestDebitUsageFromConcretesFromRateS(t *testing.T) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestDebitUsageFromConcretesRestore(t *testing.T) {
|
||||
engine.Cache.Clear(nil)
|
||||
|
||||
@@ -333,7 +336,8 @@ func TestDebitUsageFromConcretesRestore(t *testing.T) {
|
||||
t.Errorf("balance remaining: %s", cb2.blnCfg.Units)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
/*
|
||||
func TestMaxDebitUsageFromConcretes(t *testing.T) {
|
||||
engine.Cache.Clear(nil)
|
||||
|
||||
@@ -371,6 +375,7 @@ func TestMaxDebitUsageFromConcretes(t *testing.T) {
|
||||
t.Errorf("balance remaining: %s", cb2.blnCfg.Units)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
func TestRestoreAccount(t *testing.T) { //coverage purpose
|
||||
engine.Cache.Clear(nil)
|
||||
|
||||
@@ -94,7 +94,7 @@ func main() {
|
||||
return
|
||||
}
|
||||
accountSTime += time.Now().Sub(tNow)
|
||||
sumAccountS += *eEc.Usage
|
||||
sumAccountS += *eEc.Abstracts
|
||||
wgAccountS.Done()
|
||||
}()
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ func main() {
|
||||
return
|
||||
}
|
||||
accountSTime += time.Now().Sub(tNow)
|
||||
sumAccountS += *eEc.Usage
|
||||
sumAccountS += *eEc.Abstracts
|
||||
wgAccountS.Done()
|
||||
}()
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ func main() {
|
||||
return
|
||||
}
|
||||
accountSTime += time.Now().Sub(tNow)
|
||||
sumAccountS += *eEc.Usage
|
||||
sumAccountS += *eEc.Abstracts
|
||||
wgAccountS.Done()
|
||||
}()
|
||||
|
||||
|
||||
@@ -30,40 +30,46 @@ func NewEventCharges() (ec *EventCharges) {
|
||||
|
||||
// EventCharges records the charges applied to an Event
|
||||
type EventCharges struct {
|
||||
Usage *Decimal
|
||||
Cost *Decimal
|
||||
Abstracts *Decimal
|
||||
Concretes *Decimal
|
||||
Charges []*ChargedInterval
|
||||
Account *AccountProfile
|
||||
Accounting *ChargedAccounting
|
||||
Rating *ChargedRating
|
||||
Accounts []*AccountProfile
|
||||
}
|
||||
|
||||
// Merge will merge the event charges into existing
|
||||
func (ec *EventCharges) Merge(eCs ...*EventCharges) {
|
||||
for _, nEc := range eCs {
|
||||
if ec.Usage == nil {
|
||||
ec.Usage = nEc.Usage
|
||||
continue
|
||||
if ec.Abstracts != nil {
|
||||
ec.Abstracts = &Decimal{SumBig(ec.Abstracts.Big, nEc.Abstracts.Big)}
|
||||
} else { // initial
|
||||
ec.Abstracts = nEc.Abstracts
|
||||
}
|
||||
ec.Usage = &Decimal{SumBig(ec.Usage.Big, nEc.Usage.Big)}
|
||||
if ec.Concretes != nil {
|
||||
ec.Concretes = &Decimal{SumBig(ec.Concretes.Big, nEc.Concretes.Big)}
|
||||
} else { // initial
|
||||
ec.Concretes = nEc.Concretes
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// AsExtEventCharges converts EventCharges to ExtEventCharges
|
||||
func (ec *EventCharges) AsExtEventCharges() (eEc *ExtEventCharges, err error) {
|
||||
eEc = new(ExtEventCharges)
|
||||
if ec.Usage != nil {
|
||||
if flt, ok := ec.Usage.Big.Float64(); !ok {
|
||||
return nil, errors.New("cannot convert decimal Usage to float64")
|
||||
if ec.Abstracts != nil {
|
||||
if flt, ok := ec.Abstracts.Big.Float64(); !ok {
|
||||
return nil, errors.New("cannot convert decimal Abstracts to float64")
|
||||
} else {
|
||||
eEc.Usage = &flt
|
||||
eEc.Abstracts = &flt
|
||||
}
|
||||
}
|
||||
if ec.Cost != nil {
|
||||
if flt, ok := ec.Cost.Big.Float64(); !ok {
|
||||
return nil, errors.New("cannot convert decimal Cost to float64")
|
||||
if ec.Concretes != nil {
|
||||
if flt, ok := ec.Concretes.Big.Float64(); !ok {
|
||||
return nil, errors.New("cannot convert decimal Concretes to float64")
|
||||
} else {
|
||||
eEc.Cost = &flt
|
||||
eEc.Concretes = &flt
|
||||
}
|
||||
}
|
||||
// add here code for the rest of the fields
|
||||
@@ -72,6 +78,6 @@ func (ec *EventCharges) AsExtEventCharges() (eEc *ExtEventCharges, err error) {
|
||||
|
||||
// ExtEventCharges is a generic EventCharges used in APIs
|
||||
type ExtEventCharges struct {
|
||||
Usage *float64
|
||||
Cost *float64
|
||||
Abstracts *float64
|
||||
Concretes *float64
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user