diff --git a/accounts/accounts.go b/accounts/accounts.go index 3914dafdc..01d86eb7d 100644 --- a/accounts/accounts.go +++ b/accounts/accounts.go @@ -20,10 +20,12 @@ package accounts import ( "fmt" + "time" "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" + "github.com/ericlagergren/decimal" ) // NewAccountS instantiates the AccountS @@ -126,7 +128,38 @@ func (aS *AccountS) accountProcessEvent(acnt *utils.AccountProfile, aS.cfg.AccountSCfg().AttributeSConns, aS.cfg.AccountSCfg().RateSConns); err != nil { return } - fmt.Println(blncOpers) + usage := utils.NewDecimal(int64(72*time.Hour), 0) + var usgEv time.Duration + if usgEv, err = cgrEv.FieldAsDuration(utils.Usage); err != nil { + if err != utils.ErrNotFound { + return + } + // not found, try at opts level + if usgEv, err = cgrEv.OptAsDuration(utils.MetaUsage); err != nil { + if err != utils.ErrNotFound { + return + } + err = nil + } else { // found, overwrite usage + usage.Big = decimal.New(int64(usgEv), 0) + } + } else { + usage.Big = decimal.New(int64(usgEv), 0) + } + + for _, blncOper := range blncOpers { + if usage.Big.Cmp(decimal.New(0, 0)) == 0 { + return // no more debit + } + var dbted *utils.Decimal + if dbted, _, err = blncOper.debitUsage(usage, cgrEv); err != nil { + if err == utils.ErrFilterNotPassingNoCaps { + err = nil + continue + } + } + usage.Big = utils.SubstractBig(usage.Big, dbted.Big) + } return } diff --git a/accounts/libaccounts.go b/accounts/libaccounts.go index 44c89031c..14a695ad3 100644 --- a/accounts/libaccounts.go +++ b/accounts/libaccounts.go @@ -43,6 +43,12 @@ func newAccountBalanceOperators(acnt *utils.AccountProfile, var cncrtBlncs []*concreteBalance blncOpers = make([]balanceOperator, len(blnCfgs)) for i, blnCfg := range blnCfgs { + if blnCfg.Type == utils.MetaConcrete { + blncOpers[i] = newConcreteBalanceOperator(blnCfg, + fltrS, connMgr, attrSConns, rateSConns) + cncrtBlncs = append(cncrtBlncs, blncOpers[i].(*concreteBalance)) + continue + } if blncOpers[i], err = newBalanceOperator(blnCfg, cncrtBlncs, fltrS, connMgr, attrSConns, rateSConns); err != nil { return diff --git a/utils/cgrevent.go b/utils/cgrevent.go index 928c817e1..2b09270c4 100644 --- a/utils/cgrevent.go +++ b/utils/cgrevent.go @@ -56,6 +56,15 @@ func (ev *CGREvent) FieldAsString(fldName string) (val string, err error) { return IfaceAsString(iface), nil } +// OptAsString returns an option as string +func (ev *CGREvent) OptAsString(optName string) (val string, err error) { + iface, has := ev.Opts[optName] + if !has { + return "", ErrNotFound + } + return IfaceAsString(iface), nil +} + // FieldAsTime returns a field as Time instance func (ev *CGREvent) FieldAsTime(fldName string, timezone string) (t time.Time, err error) { iface, has := ev.Event[fldName] @@ -76,6 +85,16 @@ func (ev *CGREvent) FieldAsDuration(fldName string) (d time.Duration, err error) return IfaceAsDuration(iface) } +// OptAsDuration returns an option as Duration instance +func (ev *CGREvent) OptAsDuration(optName string) (d time.Duration, err error) { + iface, has := ev.Event[optName] + if !has { + err = ErrNotFound + return + } + return IfaceAsDuration(iface) +} + // FieldAsFloat64 returns a field as float64 instance func (ev *CGREvent) FieldAsFloat64(fldName string) (f float64, err error) { iface, has := ev.Event[fldName] diff --git a/utils/consts.go b/utils/consts.go index 8b655ee1a..1f6bb1a39 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -953,6 +953,7 @@ const ( MetaCDR = "*cdr" MetaExporterIDs = "*exporterIDs" MetaAsync = "*async" + MetaUsage = "*usage" ) // Migrator Action