From a417982f41e2a62f51d4405bb1204dc1465c44cd Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 31 Aug 2021 17:23:31 +0300 Subject: [PATCH] Updated AccountSummary in EventCost --- engine/account.go | 20 ++++++++++++++++++++ engine/calldesc.go | 14 +++++++++----- engine/eventcost.go | 1 + sessions/sessions.go | 4 +++- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/engine/account.go b/engine/account.go index 9ee49fe19..7d9c4cfff 100644 --- a/engine/account.go +++ b/engine/account.go @@ -1212,3 +1212,23 @@ func (as *AccountSummary) FieldAsInterface(fldPath []string) (val interface{}, e return as.Disabled, nil } } + +// UpdateBalances will add the expired balances back +func (as *AccountSummary) UpdateBalances(old *AccountSummary) { + if old == nil { + return + } + for _, initialBal := range old.BalanceSummaries { + removed := true + for _, currentBal := range as.BalanceSummaries { + if currentBal.UUID == initialBal.UUID { + removed = false + break + } + } + if removed { // add back the expired balances + initialBal.Value = 0 // it expired so lose all the values only keep track of it in this + as.BalanceSummaries = append(as.BalanceSummaries, initialBal) + } + } +} diff --git a/engine/calldesc.go b/engine/calldesc.go index 7b474f034..6f4d46275 100644 --- a/engine/calldesc.go +++ b/engine/calldesc.go @@ -792,6 +792,7 @@ func (cd *CallDescriptor) Debit() (cc *CallCost, err error) { if err != nil { return nil, err } + initialAcnt := account.AsAccountSummary() acntIDs, sgerr := account.GetUniqueSharedGroupMembers(cd) if sgerr != nil { return nil, sgerr @@ -805,7 +806,7 @@ func (cd *CallDescriptor) Debit() (cc *CallCost, err error) { _, err = guardian.Guardian.Guard(func() (iface interface{}, err error) { cc, err = cd.debit(account, cd.DryRun, !cd.DenyNegativeAccount) if err == nil { - cc.AccountSummary = cd.AccountSummary() + cc.AccountSummary = cd.AccountSummary(initialAcnt) } return }, config.CgrConfig().GeneralCfg().LockingTimeout, lkIDs...) @@ -825,6 +826,7 @@ func (cd *CallDescriptor) MaxDebit() (cc *CallCost, err error) { if err != nil { return nil, err } + initialAcnt := account.AsAccountSummary() acntIDs, err := account.GetUniqueSharedGroupMembers(cd) if err != nil { return nil, err @@ -846,7 +848,7 @@ func (cd *CallDescriptor) MaxDebit() (cc *CallCost, err error) { } if err != nil || remainingDuration == 0 { cc = cd.CreateCallCost() - cc.AccountSummary = cd.AccountSummary() + cc.AccountSummary = cd.AccountSummary(initialAcnt) if cd.GetDuration() == 0 { // add RatingInfo err = cd.LoadRatingPlans() @@ -869,7 +871,7 @@ func (cd *CallDescriptor) MaxDebit() (cc *CallCost, err error) { } cc, err = cd.debit(account, cd.DryRun, !cd.DenyNegativeAccount) if err == nil { - cc.AccountSummary = cd.AccountSummary() + cc.AccountSummary = cd.AccountSummary(initialAcnt) } return }, config.CgrConfig().GeneralCfg().LockingTimeout, lkIDs...) @@ -1030,11 +1032,13 @@ func (cd *CallDescriptor) Clone() *CallDescriptor { } // AccountSummary returns the AccountSummary for cached account -func (cd *CallDescriptor) AccountSummary() *AccountSummary { +func (cd *CallDescriptor) AccountSummary(initialAcnt *AccountSummary) *AccountSummary { if cd.account == nil { return nil } - return cd.account.AsAccountSummary() + acntSummary := cd.account.AsAccountSummary() + acntSummary.UpdateBalances(initialAcnt) + return acntSummary } // FieldAsInterface is part of utils.DataProvider diff --git a/engine/eventcost.go b/engine/eventcost.go index 04431a964..e580ff306 100644 --- a/engine/eventcost.go +++ b/engine/eventcost.go @@ -641,6 +641,7 @@ func (ec *EventCost) SyncKeys(refEC *EventCost) { // Merge will merge a list of EventCosts into this one func (ec *EventCost) Merge(ecs ...*EventCost) { for _, newEC := range ecs { + newEC.AccountSummary.UpdateBalances(ec.AccountSummary) ec.AccountSummary = newEC.AccountSummary // updated AccountSummary information for cIlIdx := range newEC.Charges { ec.appendChargingIntervalFromEventCost(newEC, cIlIdx) diff --git a/sessions/sessions.go b/sessions/sessions.go index 1385cd9e4..b351a0fda 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -598,7 +598,9 @@ func (sS *SessionS) refundSession(s *Session, sRunIdx int, rUsage time.Duration) return } if acnt.ID != "" { // Account info updated, update also cached AccountSummary - sr.EventCost.AccountSummary = acnt.AsAccountSummary() + acntSummary := acnt.AsAccountSummary() + acntSummary.UpdateBalances(sr.EventCost.AccountSummary) + sr.EventCost.AccountSummary = acntSummary } return }