diff --git a/accounts/accounts.go b/accounts/accounts.go index 0d068d68e..2bbd951a0 100644 --- a/accounts/accounts.go +++ b/accounts/accounts.go @@ -268,23 +268,19 @@ func (aS *AccountS) refundCharges(ctx *context.Context, tnt string, ecs *utils.E } for _, chrg := range ecs.Charges { acntChrg := ecs.Accounting[chrg.ChargingID] - var ufValue *utils.Decimal - if uf, has := ecs.UnitFactors[acntChrg.UnitFactorID]; has { - ufValue = uf.Factor - } if acntChrg.BalanceID != utils.MetaTransAbstract { // *transAbstracts is not a real balance, hence the exception refundUnitsOnAccount( acntsIdxed[acntChrg.AccountID], - uncompressUnits(acntChrg.Units, chrg.CompressFactor), - ecs.Accounts[acntChrg.AccountID].Balances[acntChrg.BalanceID], ufValue) + uncompressUnits(acntChrg.Units, chrg.CompressFactor, acntChrg, ecs.UnitFactors), + ecs.Accounts[acntChrg.AccountID].Balances[acntChrg.BalanceID]) alteredAcnts.Add(acntChrg.AccountID) } for _, chrgID := range acntChrg.JoinedChargeIDs { // refund extra charges extraChrg := ecs.Accounting[chrgID] refundUnitsOnAccount( acntsIdxed[extraChrg.AccountID], - uncompressUnits(extraChrg.Units, chrg.CompressFactor), - ecs.Accounts[acntChrg.AccountID].Balances[extraChrg.BalanceID], ufValue) + uncompressUnits(extraChrg.Units, chrg.CompressFactor, extraChrg, ecs.UnitFactors), + ecs.Accounts[acntChrg.AccountID].Balances[extraChrg.BalanceID]) alteredAcnts.Add(extraChrg.AccountID) } } diff --git a/accounts/accounts_test.go b/accounts/accounts_test.go index 1ad19cf7a..a2150c3de 100644 --- a/accounts/accounts_test.go +++ b/accounts/accounts_test.go @@ -1603,7 +1603,9 @@ func TestV1DebitAbstractsEventCharges(t *testing.T) { Weight: 30, }, }, - + Opts: map[string]interface{}{ + utils.MetaBalanceLimit: -200.0, + }, CostIncrements: []*utils.CostIncrement{ { Increment: utils.NewDecimal(int64(time.Second), 0), diff --git a/accounts/libaccounts.go b/accounts/libaccounts.go index 54c3e9ab5..dcec14fa9 100644 --- a/accounts/libaccounts.go +++ b/accounts/libaccounts.go @@ -233,6 +233,7 @@ func maxDebitAbstractsFromConcretes(ctx *context.Context, aUnits *decimal.Big, paidConcrtUnts := origConcrtUnts // so we can revert when higher abstracts are not possible var aPaid, aDenied *decimal.Big maxItr := config.CgrConfig().AccountSCfg().MaxIterations + //lastSuccesDebit := new(utils.EventCharges) for i := 0; i <= maxItr; i++ { if i != 0 { restoreUnitsFromClones(cncrtBlncs, origConcrtUnts) @@ -279,6 +280,12 @@ func maxDebitAbstractsFromConcretes(ctx *context.Context, aUnits *decimal.Big, return } err = nil + /* + if lastSuccesDebit != nil { + ec = utils.NewEventCharges() + ec.Merge(lastSuccesDebit) + } + */ // ErrInsufficientCredit aDenied = utils.CloneDecimalBig(aUnits) if aPaid == nil { // going backwards @@ -298,6 +305,7 @@ func maxDebitAbstractsFromConcretes(ctx *context.Context, aUnits *decimal.Big, if ec == nil { ec = utils.NewEventCharges() } + //lastSuccesDebit = ecDbt ec.Merge(ecDbt) if i == 0 { // no estimation done, covering full break @@ -322,9 +330,6 @@ func maxDebitAbstractsFromConcretes(ctx *context.Context, aUnits *decimal.Big, aPaid = decimal.New(0, 0) ec = utils.NewEventCharges() } - /* - utils.Logger.Debug(fmt.Sprintf("aPaid %v, incr: %v, round: %v", aPaid, costIcrm.Increment.Big, roundUnitsWithIncrements(aPaid, costIcrm.Increment.Big))) - */ ec.Abstracts = &utils.Decimal{aPaid} restoreUnitsFromClones(cncrtBlncs, paidConcrtUnts) return @@ -354,26 +359,27 @@ func unlockAccounts(acnts utils.AccountsWithWeight) { } // uncompressUnits returns the uncompressed value of the units if compressFactor is provided -func uncompressUnits(units *utils.Decimal, cmprsFctr int) (tU *utils.Decimal) { +func uncompressUnits(units *utils.Decimal, cmprsFctr int, acntChrg *utils.AccountCharge, uf map[string]*utils.UnitFactor) (tU *utils.Decimal) { tU = units if cmprsFctr > 1 { tU = &utils.Decimal{utils.MultiplyBig(tU.Big, decimal.New(int64(cmprsFctr), 0))} } + // check it this has unit factor + if newUf, has := uf[acntChrg.UnitFactorID]; has { + tU = utils.MultiplyDecimal(tU, newUf.Factor) + } return } // refundUnitsOnAccount is responsible for returning the units back to the balance // origBlnc is used for both it's ID as well as as a configuration backup in case when the balance is not longer present -func refundUnitsOnAccount(acnt *utils.Account, units *utils.Decimal, origBlnc *utils.Balance, ufValue *utils.Decimal) { +func refundUnitsOnAccount(acnt *utils.Account, units *utils.Decimal, origBlnc *utils.Balance) { if _, has := acnt.Balances[origBlnc.ID]; has { acnt.Balances[origBlnc.ID].Units = &utils.Decimal{ utils.SumBig( acnt.Balances[origBlnc.ID].Units.Big, units.Big)} - if ufValue != nil { - acnt.Balances[origBlnc.ID].Units = utils.MultiplyDecimal(acnt.Balances[origBlnc.ID].Units, ufValue) - } } else { acnt.Balances[origBlnc.ID] = origBlnc.Clone() acnt.Balances[origBlnc.ID].Units = &utils.Decimal{utils.CloneDecimalBig(units.Big)} diff --git a/apis/accounts_it_test.go b/apis/accounts_it_test.go index d13579268..c53819c07 100644 --- a/apis/accounts_it_test.go +++ b/apis/accounts_it_test.go @@ -47,32 +47,28 @@ var ( testAccSResetStorDb, testAccSStartEngine, testAccSRPCConn, - /* - testGetAccProfileBeforeSet, - testGetAccProfilesBeforeSet, - testAccSetAccProfile, - testAccGetAccIDs, - testAccGetAccs, - testAccGetAccIDsCount, - testGetAccBeforeSet2, - testAccSetAcc2, - testAccGetAccIDs2, - testAccGetAccs2, - testAccGetAccIDsCount2, - testAccRemoveAcc, - testAccGetAccs3, - testAccGetAccsWithPrefix, - testAccGetAccountsForEvent, - testAccMaxAbstracts, - testAccDebitAbstracts, - testAccMaxConcretes, - testAccDebitConcretes, - */ + testGetAccProfileBeforeSet, + testGetAccProfilesBeforeSet, + testAccSetAccProfile, + testAccGetAccIDs, + testAccGetAccs, + testAccGetAccIDsCount, + testGetAccBeforeSet2, + testAccSetAcc2, + testAccGetAccIDs2, + testAccGetAccs2, + testAccGetAccIDsCount2, + testAccRemoveAcc, + testAccGetAccs3, + testAccGetAccsWithPrefix, + testAccGetAccountsForEvent, + testAccMaxAbstracts, + testAccDebitAbstracts, + testAccMaxConcretes, + testAccDebitConcretes, // RefundCharges test testAccRefundCharges, - /* - testAccActionSetRmvBalance, - */ + testAccActionSetRmvBalance, testAccSKillEngine, } ) @@ -1341,7 +1337,7 @@ func testAccRefundCharges(t *testing.T) { ID: "AB", Weights: ";10", Type: utils.MetaAbstract, - Units: "5m", + Units: "5m", // 300s UnitFactors: []*utils.APIUnitFactor{ { Factor: 10, @@ -1363,6 +1359,11 @@ func testAccRefundCharges(t *testing.T) { Weights: ";5", Type: utils.MetaConcrete, Units: "50", + UnitFactors: []*utils.APIUnitFactor{ + { + Factor: 15, + }, + }, CostIncrements: []*utils.APICostIncrement{ { Increment: "1s",