diff --git a/accounts/abstractbalance.go b/accounts/abstractbalance.go index 5aeadc8e1..ecacd554f 100644 --- a/accounts/abstractbalance.go +++ b/accounts/abstractbalance.go @@ -256,6 +256,13 @@ func (aB *abstractBalance) debitUsage(usage *utils.Decimal, startTime time.Time, usage.Big = roundedUsageWithIncrements(usage.Big, costIcrm.Increment.Big) // make sure usage is multiple of increments } if i == 0 { // no estimation done, covering full + aB.blnCfg.Units.Big = utils.SubstractBig(aB.blnCfg.Units.Big, usage.Big) + if hasLmt { // put back the limit + aB.blnCfg.Units.Big = utils.SumBig(aB.blnCfg.Units.Big, blncLmt.Big) + } + if hasUF { + usage.Big = utils.DivideBig(usage.Big, uF.Factor.Big) + } return } usagePaid = new(decimal.Big).Copy(usage.Big) diff --git a/accounts/abstractbalance_test.go b/accounts/abstractbalance_test.go index b011fde04..f4845da72 100644 --- a/accounts/abstractbalance_test.go +++ b/accounts/abstractbalance_test.go @@ -43,7 +43,6 @@ func TestABDebitUsageFromConcrete(t *testing.T) { }, Units: utils.NewDecimal(500, 0), // 500 EURcents }, - fltrS: new(engine.FilterS), }, { blnCfg: &utils.Balance{ @@ -54,7 +53,6 @@ func TestABDebitUsageFromConcrete(t *testing.T) { }, Units: utils.NewDecimal(125, 2), }, - fltrS: new(engine.FilterS), }, }} // consume only from first balance @@ -105,3 +103,41 @@ func TestABDebitUsageFromConcrete(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{ + ID: "AB1", + Type: utils.MetaAbstract, + CostIncrements: []*utils.CostIncrement{ + { + Increment: utils.NewDecimal(int64(time.Duration(time.Second)), 0), + RecurrentFee: utils.NewDecimal(1, 0)}, + }, + Units: utils.NewDecimal(int64(time.Duration(60*time.Second)), 0), // 1 Minute + }, + cncrtBlncs: []*concreteBalance{ + { + blnCfg: &utils.Balance{ + ID: "CB1", + Type: utils.MetaConcrete, + UnitFactors: []*utils.UnitFactor{ + { + Factor: utils.NewDecimal(1, 0), // EuroCents + }, + }, + Units: utils.NewDecimal(50, 0), // 50 EURcents + }, + }, + }, + fltrS: new(engine.FilterS)} + + if _, err := aB.debitUsage(utils.NewDecimal(int64(time.Duration(30*time.Second)), 0), + time.Now(), new(utils.CGREvent)); err != nil { + t.Error(err) + } else if aB.blnCfg.Units.Compare(utils.NewDecimal(int64(time.Duration(30*time.Second)), 0)) != 0 { + t.Errorf("Unexpected units in abstract balance: %s", aB.blnCfg.Units) + } else if aB.cncrtBlncs[0].blnCfg.Units.Compare(utils.NewDecimal(20, 0)) != 0 { + t.Errorf("Unexpected units in abstract balance: %s", aB.blnCfg.Units) + } +}