AccountS - No debits should return nil EventCharges

This commit is contained in:
DanB
2021-03-23 20:34:39 +01:00
parent 86d141f761
commit a29d90df3f
4 changed files with 26 additions and 9 deletions

View File

@@ -159,7 +159,6 @@ func (aS *AccountS) accountsDebit(acnts []*utils.AccountProfileWithWeight,
} else {
usage = decimal.New(int64(usgEv), 0)
}
ec = utils.NewEventCharges()
acntBkps := make([]utils.AccountBalancesBackup, len(acnts))
for i, acnt := range acnts {
if usage.Cmp(decimal.New(0, 0)) == 0 {
@@ -174,6 +173,12 @@ func (aS *AccountS) accountsDebit(acnts []*utils.AccountProfileWithWeight,
}
return
}
if ecDbt == nil {
continue
}
if ec == nil { // no debit performed yet
ec = utils.NewEventCharges()
}
if store && acnt.AccountProfile.BalancesAltered(acntBkps[i]) {
if err = aS.dm.SetAccountProfile(acnt.AccountProfile, false); err != nil {
restoreAccounts(aS.dm, acnts, acntBkps)
@@ -212,7 +217,7 @@ func (aS *AccountS) accountDebit(acnt *utils.AccountProfile, usage *decimal.Big,
aS.cfg.AccountSCfg().AttributeSConns, aS.cfg.AccountSCfg().RateSConns); err != nil {
return
}
ec = utils.NewEventCharges()
for _, blncOper := range blncOpers {
debFunc := blncOper.debitAbstracts
if concretes {
@@ -230,6 +235,12 @@ func (aS *AccountS) accountDebit(acnt *utils.AccountProfile, usage *decimal.Big,
}
return
}
if ecDbt == nil {
continue // no debit performed
}
if ec == nil { // first debit
ec = utils.NewEventCharges()
}
var used *decimal.Big
if concretes {
used = ecDbt.Concretes.Big

View File

@@ -429,11 +429,10 @@ func TestAccountsDebit(t *testing.T) {
accntsPrf[0].Balances["AbstractBalance1"].Weights[0].FilterIDs = []string{}
cgrEvent.Event[utils.Usage] = "300ns"
expectedUsage := &utils.Decimal{decimal.New(0, 0)}
if evCh, err := accnts.accountsDebit(accntsPrf, cgrEvent, true, true); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(expectedUsage, evCh.Concretes) {
t.Errorf("Expected %+v, received %+v", utils.ToJSON(expectedUsage), utils.ToJSON(evCh.Concretes))
} else if evCh != nil {
t.Errorf("received %+v", utils.ToJSON(evCh))
}
var err error

View File

@@ -136,7 +136,9 @@ func (cB *concreteBalance) debitConcretes(cUnits *decimal.Big,
if hasUF {
dbted = utils.DivideBig(dbted, uF.Factor.Big)
}
if dbted.Cmp(decimal.New(0, 0)) == 0 {
return // no event cost for 0 debit
}
ec = utils.NewEventCharges()
ec.Concretes = &utils.Decimal{dbted}
// UnitFactors
@@ -153,5 +155,5 @@ func (cB *concreteBalance) debitConcretes(cUnits *decimal.Big,
BalanceLimit: blncLmt,
UnitFactorID: ufID,
}
return &utils.EventCharges{Concretes: &utils.Decimal{dbted}}, nil
return
}

View File

@@ -195,14 +195,19 @@ func debitConcreteUnits(cUnits *decimal.Big,
acntID string, cncrtBlncs []*concreteBalance,
cgrEv *utils.CGREvent) (ec *utils.EventCharges, err error) {
ec = utils.NewEventCharges()
clnedUnts := cloneUnitsFromConcretes(cncrtBlncs)
for _, cB := range cncrtBlncs {
var ecCncrt *utils.EventCharges
if ecCncrt, err = cB.debitConcretes(cUnits, cgrEv); err != nil {
if ecCncrt, err = cB.debitConcretes(new(decimal.Big).Copy(cUnits), cgrEv); err != nil {
restoreUnitsFromClones(cncrtBlncs, clnedUnts)
return nil, err
}
if ecCncrt == nil { // no debit performed
continue
}
if ec == nil {
ec = utils.NewEventCharges()
}
ec.Merge(ecCncrt)
cUnits = utils.SubstractBig(cUnits, ecCncrt.Concretes.Big)
if cUnits.Cmp(decimal.New(0, 0)) <= 0 {