|
|
@@ -37,31 +37,50 @@ class CdrEvent:
|
|
|
class CdrEvents:
|
|
|
def __init__(self):
|
|
|
self._events = []
|
|
|
- self._channels = []
|
|
|
- self._dstchannels = []
|
|
|
+ self._channels = {}
|
|
|
+ self._dstchannels = {}
|
|
|
self.start = 0
|
|
|
+ self._waitingchannel = None
|
|
|
|
|
|
def add(self, event):
|
|
|
if not isinstance(event, CdrEvent):
|
|
|
event = CdrEvent(event)
|
|
|
if not self.start:
|
|
|
self.start = event.calldate
|
|
|
- if event.channel not in self._channels:
|
|
|
- self._channels[event.channel] = event
|
|
|
- if event.dstchannel not in self._dstchannels:
|
|
|
- self._dstchannels[event.dstchannel] = event.dst
|
|
|
+ if (event.channel.id not in self._channels):
|
|
|
+ self._channels[event.channel.id] = event
|
|
|
+ if (event.dstchannel.id not in self._dstchannels):
|
|
|
+ self._dstchannels[event.dstchannel.id] = event.dst
|
|
|
+ if (self._waitingchannel is not None) and (self._waitingchannel.id == event.channel.id): # if dial event after queue event
|
|
|
+ for e in self._events:
|
|
|
+ if (e.lastapp == 'Queue') and (e.dstchannel.id == event.channel.id):
|
|
|
+ e.duration = (event.calldate-e.calldate).total_seconds() + event.duration
|
|
|
+ e.billsec = event.billsec
|
|
|
+ self._waitingchannel = None
|
|
|
if (event.lastapp == 'Queue'):
|
|
|
+ event.billsec = 0
|
|
|
+ queueevent = event
|
|
|
for e in self._events:
|
|
|
- if (e.lastapp == 'Queue') and (e.uniqueid == event.uniqueid):
|
|
|
- if (event.disposition == 'ANSWERED'):
|
|
|
- e.disposition = 'ANSWERED'
|
|
|
- if event.dstchannel in self._channels:
|
|
|
- dialevent = self._channels[event.dstchannel]
|
|
|
- e.duration = e.start-dialevent.start + dialevent.duration
|
|
|
- e.billsec = dialevent.billsec
|
|
|
- return # if it not fiars queue event - miss it
|
|
|
- if (event.lastapp == 'Dial' and event.dstchannel in self._dstchannels):
|
|
|
- event.dst = self._dstchannels[event.dstchannel]
|
|
|
+ if (e.lastapp == 'Queue') and (e.uniqueid == event.uniqueid):#find first queue event
|
|
|
+ queueevent = e
|
|
|
+ if (event.disposition == 'ANSWERED'): #if it answered - fill duration and waitng based on answered dial event
|
|
|
+ queueevent.disposition = 'ANSWERED'
|
|
|
+ queueevent.dstchannel = event.dstchannel
|
|
|
+ if (event.dstchannel.id in self._channels): # if dial event before queue event
|
|
|
+ dialevent = self._channels[event.dstchannel.id]
|
|
|
+ queueevent.duration = (dialevent.calldate-queueevent.calldate).total_seconds() + dialevent.duration
|
|
|
+ queueevent.billsec = dialevent.billsec
|
|
|
+ else:
|
|
|
+ self._waitingchannel = event.dstchannel # wait for dial event
|
|
|
+ else:
|
|
|
+ if queueevent.disposition != 'ANSWERED': #count total queue duration
|
|
|
+ queueevent.duration = (event.calldate-queueevent.calldate).total_seconds() + event.duration
|
|
|
+ if (event != queueevent):
|
|
|
+ return; # add only forst queue event
|
|
|
+ if (event.lastapp == 'Dial' and event.dstchannel.id in self._dstchannels):
|
|
|
+ event.dst = self._dstchannels[event.dstchannel.id] #get dst from fisrt event with rthis channel. for transfer
|
|
|
+ if (event.lastapp == 'Dial' and event.dstchannel.id in self._channels):
|
|
|
+ event.dst = self._channels[event.dstchannel.id].dst #for transfer to queue
|
|
|
self.end = event.calldate + td(seconds=event.duration)
|
|
|
self._events.append(event)
|
|
|
|
|
|
@@ -96,9 +115,9 @@ class CdrEvents:
|
|
|
simple_event = {'start': event.calldate,
|
|
|
'answered': event.disposition=='ANSWERED',
|
|
|
'duration': event.billsec,
|
|
|
- 'waiting': event.duration = event.billsec,
|
|
|
+ 'waiting': event.duration - event.billsec,
|
|
|
'application': event.lastapp,
|
|
|
- 'src': event.src,
|
|
|
+ 'caller': event.cnum,
|
|
|
'dst': event.dst,
|
|
|
'uniqueid': event.uniqueid,
|
|
|
'file': event.recordingfile}
|