diff --git a/accounts/accounts.go b/accounts/accounts.go index c37844e01..771be945b 100644 --- a/accounts/accounts.go +++ b/accounts/accounts.go @@ -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 diff --git a/accounts/accounts_test.go b/accounts/accounts_test.go index 7f2280c5e..7c8ee4959 100644 --- a/accounts/accounts_test.go +++ b/accounts/accounts_test.go @@ -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 diff --git a/accounts/concretebalance.go b/accounts/concretebalance.go index 3dc1e8b73..f159dc6a0 100644 --- a/accounts/concretebalance.go +++ b/accounts/concretebalance.go @@ -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 } diff --git a/accounts/libaccounts.go b/accounts/libaccounts.go index dad004a58..5d9df5e27 100644 --- a/accounts/libaccounts.go +++ b/accounts/libaccounts.go @@ -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 {