mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
initial code for loop index and call duration
This commit is contained in:
@@ -75,6 +75,8 @@ type CallDescriptor struct {
|
||||
TOR string
|
||||
Tenant, Subject, Account, Destination string
|
||||
TimeStart, TimeEnd time.Time
|
||||
LoopIndex float64 // indicates the postion of this segment in a cost request loop
|
||||
CallDuration float64 // the call duration so far (partial or final)
|
||||
Amount float64
|
||||
FallbackSubject string // the subject to check for destination if not found on primary subject
|
||||
ActivationPeriods []*ActivationPeriod
|
||||
@@ -266,11 +268,13 @@ func (cd *CallDescriptor) GetCost() (*CallCost, error) {
|
||||
timespans := cd.splitInTimeSpans()
|
||||
cost := 0.0
|
||||
connectionFee := 0.0
|
||||
for i, ts := range timespans {
|
||||
if i == 0 && ts.MinuteInfo == nil && ts.Interval != nil {
|
||||
connectionFee = ts.Interval.ConnectFee
|
||||
if cd.LoopIndex == 0 { // only add connect fee if this is the first/only call cost request
|
||||
for i, ts := range timespans {
|
||||
if i == 0 && ts.MinuteInfo == nil && ts.Interval != nil {
|
||||
connectionFee = ts.Interval.ConnectFee
|
||||
}
|
||||
cost += ts.getCost(cd)
|
||||
}
|
||||
cost += ts.getCost(cd)
|
||||
}
|
||||
cc := &CallCost{
|
||||
Direction: cd.Direction,
|
||||
|
||||
@@ -211,6 +211,8 @@ func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) {
|
||||
TOR: ev.GetTOR(),
|
||||
Subject: ev.GetSubject(),
|
||||
Account: ev.GetAccount(),
|
||||
LoopIndex: 0,
|
||||
CallDuration: endTime.Sub(startTime).Seconds(),
|
||||
Destination: ev.GetDestination(),
|
||||
TimeStart: startTime,
|
||||
TimeEnd: endTime,
|
||||
@@ -230,7 +232,7 @@ func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) {
|
||||
return // why would we have 0 callcosts
|
||||
}
|
||||
lastCC := s.CallCosts[len(s.CallCosts)-1]
|
||||
// put credit back
|
||||
// put credit back
|
||||
start := time.Now()
|
||||
end := lastCC.Timespans[len(lastCC.Timespans)-1].TimeEnd
|
||||
refoundDuration := end.Sub(start).Seconds()
|
||||
@@ -303,9 +305,11 @@ func (sm *FSSessionManager) OnChannelHangupComplete(ev Event) {
|
||||
|
||||
}
|
||||
|
||||
func (sm *FSSessionManager) LoopAction(s *Session, cd *rater.CallDescriptor) {
|
||||
func (sm *FSSessionManager) LoopAction(s *Session, cd *rater.CallDescriptor, index float64) {
|
||||
cc := &rater.CallCost{}
|
||||
cd.LoopIndex = index
|
||||
cd.Amount = sm.debitPeriod.Seconds()
|
||||
cd.CallDuration += cd.Amount
|
||||
err := sm.connector.MaxDebit(*cd, cc)
|
||||
if err != nil {
|
||||
rater.Logger.Err(fmt.Sprintf("Could not complete debit opperation: %v", err))
|
||||
|
||||
@@ -38,7 +38,7 @@ type Session struct {
|
||||
|
||||
// Creates a new session and starts the debit loop
|
||||
func NewSession(ev Event, sm SessionManager) (s *Session) {
|
||||
// Ignore calls which have nothing to do with CGRateS
|
||||
// Ignore calls which have nothing to do with CGRateS
|
||||
if strings.TrimSpace(ev.GetReqType()) == "" {
|
||||
return
|
||||
}
|
||||
@@ -80,6 +80,7 @@ func NewSession(ev Event, sm SessionManager) (s *Session) {
|
||||
// the debit loop method (to be stoped by sending somenting on stopDebit channel)
|
||||
func (s *Session) startDebitLoop() {
|
||||
nextCd := *s.callDescriptor
|
||||
index := 0.0
|
||||
for {
|
||||
select {
|
||||
case <-s.stopDebit:
|
||||
@@ -90,8 +91,9 @@ func (s *Session) startDebitLoop() {
|
||||
nextCd.TimeStart = time.Now()
|
||||
}
|
||||
nextCd.TimeEnd = time.Now().Add(s.sessionManager.GetDebitPeriod())
|
||||
s.sessionManager.LoopAction(s, &nextCd)
|
||||
s.sessionManager.LoopAction(s, &nextCd, index)
|
||||
time.Sleep(s.sessionManager.GetDebitPeriod())
|
||||
index++
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,7 +129,7 @@ func (s *Session) String() string {
|
||||
return fmt.Sprintf("%v: %s(%s) -> %s", s.callDescriptor.TimeStart, s.callDescriptor.Subject, s.callDescriptor.Account, s.callDescriptor.Destination)
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
func (s *Session) SaveOperations() {
|
||||
go func() {
|
||||
if s == nil || len(s.CallCosts) == 0 {
|
||||
|
||||
@@ -28,7 +28,7 @@ type SessionManager interface {
|
||||
Connect(*config.CGRConfig) error
|
||||
DisconnectSession(*Session, string)
|
||||
RemoveSession(*Session)
|
||||
LoopAction(*Session, *rater.CallDescriptor)
|
||||
LoopAction(*Session, *rater.CallDescriptor, float64)
|
||||
GetDebitPeriod() time.Duration
|
||||
GetDbLogger() rater.DataStorage
|
||||
Shutdown() error
|
||||
|
||||
Reference in New Issue
Block a user